packages feed

alms-0.4.9: src/Basis/IO.hs

{-# LANGUAGE
      DeriveDataTypeable,
      QuasiQuotes,
      StandaloneDeriving
  #-}
module Basis.IO ( entries ) where

import qualified IO

import Data.Data (Typeable, Data)
import BasisUtils
import Syntax
import Util
import Value (Valuable(..), vinjData, vprjDataM)

import qualified Loc
import qualified Syntax.Notable
import qualified Syntax.Decl

instance Valuable IO.Handle where
  veq = (==)
  vpprPrec _ _ = text "#<handle>"

instance Valuable IO.IOMode where
  veq      = (==)
  vpprPrec _ = text . show
  vinj     = vinjData
  vprjM    = vprjDataM
deriving instance Typeable IO.IOMode
deriving instance Data IO.IOMode

entries :: [Entry Raw]
entries = [
    dec [$dc| type handle |],
    dec [$dc| type ioMode = ReadMode
                           | WriteMode
                           | AppendMode
                           | ReadWriteMode |],
    -- File operations
    fun "openFile"        -: [$ty| string -> ioMode -> handle |]
      -= IO.openFile,
    fun "hGetChar"        -: [$ty| handle -> char |]
      -= fmap char2integer . IO.hGetChar,
    fun "hGetLine"        -: [$ty| handle -> string |]
      -= IO.hGetLine,
    fun "hIsEOF"          -: [$ty| handle -> bool |]
      -= IO.hIsEOF,
    fun "hPutChar"        -: [$ty| handle -> char -> unit |]
      -= \h -> IO.hPutChar h . integer2char,
    fun "hPutStr"         -: [$ty| handle -> string -> unit |]
      -= IO.hPutStr,
    fun "hClose"          -: [$ty| handle -> unit |]
      -= IO.hClose,
    fun "hFlush"          -: [$ty| handle -> unit |]
      -= IO.hFlush,

    val "stdin"  -: [$ty| handle |] -= IO.stdin,
    val "stdout" -: [$ty| handle |] -= IO.stdout,
    val "stderr" -: [$ty| handle |] -= IO.stderr
  ]