import Hugs.IO

main :: IO ()
main = do
  putStrLn "Please enter your name:"
  name <- getLine
  putStrLn ("Hello " ++ name ++ "!")
  copyFile "smm.pl" "smm.copy"

copyFile :: FilePath -> FilePath -> IO ()
copyFile inFile outFile = do
  inHandle <- openFile inFile ReadMode
  outHandle <- openFile outFile WriteMode
  copyLoop inHandle outHandle

copyLoop :: Handle -> Handle -> IO ()
copyLoop inp out = do
  iseof <- hIsEOF inp
  if iseof then return () else do
    line <- hGetLine inp 
    hPutStr out line
    hPutChar out '\n'
    copyLoop inp out

-- complexity examples

fac, fib, fib2 :: Integer -> Integer
fac 0 = 1
fac n = n*(fac (n-1))

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

fib2 n = helper n 0 1 where
  helper 0 fn1 fn2 = fn1
  helper n fn1 fn2 = helper (n-1) (fn1+fn2) fn1

fib3 :: Integer -> (Integer, Integer)
fib3 0 = (0,1)
fib3 n = (fn1, fn1+fn2) where (fn2,fn1) = fib3 (n-1)

