==================
IO monad
==================

open import Agda.Builtin.IO public using (IO)

infixl 1 _>>=_

postulate
  return : ∀ {a} {A : Set a} → A → IO A
  _>>=_  : ∀ {a b} {A : Set a} {B : Set b} → IO A → (A → IO B) → IO B

{-# COMPILE GHC return = \_ _ -> return    #-}
{-# COMPILE GHC _>>=_  = \_ _ _ _ -> (>>=) #-}
{-# COMPILE UHC return = \_ _ x -> UHC.Agda.Builtins.primReturn x #-}
{-# COMPILE UHC _>>=_  = \_ _ _ _ x y -> UHC.Agda.Builtins.primBind x y #-}


---

(source_file
    (open (import (module_name (qid)))
      (import_directive)
      (import_directive (id)))
    (infix (integer) (bid))
    (postulate
        (function
            (lhs (function_name (atom (qid))))
            (rhs (expr
                (forall
                    (untyped_binding (atom (qid)))
                    (typed_binding
                        (atom (qid))
                        (expr (atom (SetN (atom (qid))))))
                    (expr
                        (atom (qid))
                        (expr
                            (atom (qid))
                            (atom (qid))))))))
        (function
            (lhs (function_name (atom (qid))))
            (rhs (expr
                (forall
                    (untyped_binding
                        (atom (qid))
                        (atom (qid)))
                    (typed_binding
                        (atom (qid))
                        (expr (atom (SetN (atom (qid))))))
                    (typed_binding
                        (atom (qid))
                        (expr (atom (SetN (atom (qid))))))
                    (expr (atom (qid))
                        (atom (qid))
                        (expr
                            (atom (expr
                                (atom (qid))
                                (expr
                                    (atom (qid))
                                    (atom (qid)))))
                            (expr
                                (atom (qid))
                                (atom (qid))))))))))
    (pragma)
    (pragma)
    (pragma)
    (pragma))
