open import Data.Integer using (ℤ) open import Data.List using (List) open import Data.String using (String) open import Data.Unit using (⊤) open import Library.Monad module Library.IO where open import IO.Primitive public using (IO) {-# FOREIGN GHC import qualified Data.Text #-} {-# FOREIGN GHC import qualified Data.Text.IO #-} {-# FOREIGN GHC import qualified System.Exit #-} {-# FOREIGN GHC import qualified System.Environment #-} {-# FOREIGN GHC import qualified System.IO #-} postulate exitFailure : ∀{a} {A : Set a} → IO A getArgs : IO (List String) putStr : String → IO ⊤ putStrLn : String → IO ⊤ readFiniteFile : String → IO String readInt : IO ℤ {-# COMPILE GHC exitFailure = \ _ _ -> System.Exit.exitFailure #-} {-# COMPILE GHC getArgs = map Data.Text.pack <$> System.Environment.getArgs #-} {-# COMPILE GHC putStr = System.IO.putStr . Data.Text.unpack #-} {-# COMPILE GHC putStrLn = System.IO.putStrLn . Data.Text.unpack #-} {-# COMPILE GHC readFiniteFile = Data.Text.IO.readFile . Data.Text.unpack #-} {-# COMPILE GHC readInt = (System.IO.readLn :: System.IO.IO Integer) #-} instance functorIO : ∀ {a} → Functor (IO {a}) fmap {{functorIO}} f mx = mx IO.Primitive.>>= λ x → IO.Primitive.return (f x) applicativeIO : ∀ {a} → Applicative (IO {a}) pure {{applicativeIO}} = IO.Primitive.return _<*>_ {{applicativeIO}} mf mx = mf IO.Primitive.>>= λ f → f <$> mx monadIO : ∀ {a} → Monad (IO {a}) _>>=_ {{monadIO}} = IO.Primitive._>>=_