module Prelude.Week1 (
Char, String, Int, Double, Bool,
(+), (), (*), mod, (>), (<), (>=), (<=), (==), (/=),
(+.), (-.), (*.), (>.), (<.), (>=.), (<=.), (==.), (/=.),
doubleToString, intToString, charToString, intToDouble, intToChar, charToInt,
IORequest(..), IOResponse(..), run,
(<>),
(.), trace,
module Data.List
) where
import qualified Prelude as P
import qualified Data.Char
import Prelude (fmap, map, (>>), (>>=), return, putStrLn, getLine, readFile, ($), print, (.), mapM, IO)
import System.IO.Unsafe (unsafePerformIO)
import Control.DeepSeq (deepseq, NFData)
import System.Exit (exitSuccess)
import Prelude.Week0
import Data.List
data IORequest = PrintString String
| Exit
| ReadString
| ReadFile String
instance NFData IOResponse
data IOResponse = Success
| FileContents String
| NextLine String
run :: ([IOResponse] -> [IORequest]) -> IO ()
run main = deepseq responses $ return ()
where
requests = main responses
responses = map (unsafePerformIO . processRequest) requests
processRequest Exit = exitSuccess >> return Success
processRequest (PrintString str) = putStrLn str >> return Success
processRequest ReadString = fmap NextLine getLine
processRequest (ReadFile filename) = P.fmap FileContents (readFile filename)