module NativeIO where
open import Unit public
open import Data.List
open import Data.Nat
open import Data.String.Base using (String) public
{-# FOREIGN GHC import qualified Data.Text #-}
{-# FOREIGN GHC import qualified System.Environment #-}
postulate
  NativeIO     : Set → Set
  nativeReturn : {A : Set} → A → NativeIO A
  _native>>=_  : {A B : Set} → NativeIO A → (A → NativeIO B) → NativeIO B
  _native>>_  : {A B : Set} → NativeIO A → NativeIO B → NativeIO B
{-# BUILTIN IO NativeIO #-}
{-# COMPILE GHC NativeIO = type IO #-}
{-# COMPILE GHC nativeReturn = (\_ -> return :: a -> IO a) #-}
{-# COMPILE GHC _native>>=_ = (\_ _ -> (>>=) :: IO a -> (a -> IO b) -> IO b) #-}
{-# COMPILE GHC _native>>_  = (\_ _ -> (>>) :: IO a -> IO b -> IO b) #-}
postulate
  nativeGetLine   : NativeIO String
  nativePutStrLn  : String → NativeIO Unit
{-# COMPILE GHC nativePutStrLn = (\ s -> putStrLn (Data.Text.unpack s)) #-}
{-# COMPILE GHC nativeGetLine = (fmap Data.Text.pack getLine) #-}
postulate
  getArgs : NativeIO (List String)
  primShowNat : ℕ → String
{-# COMPILE GHC primShowNat = Data.Text.pack . show #-}
{-# COMPILE GHC getArgs =     fmap (map Data.Text.pack) System.Environment.getArgs #-}
{-# FOREIGN GHC import qualified Debug.Trace as Trace #-}
{-# FOREIGN GHC
debug = flip Trace.trace
debug' :: c -> Data.Text.Text -> c
debug' c txt = debug c (Data.Text.unpack txt)
#-}
postulate debug : {A : Set} →  A → String → A
{-# COMPILE GHC debug = (\x -> debug') #-}
postulate debug₁ : {A : Set₁} →  A → String → A
{-# COMPILE GHC debug₁ = (\x -> debug') #-}