module NHC.Internal
( _apply1
, _apply2
, _apply3
, _apply4
, _id
, _eqInteger
, _eqFloat
, _eqDouble
-- IO stuff
, World(..)
, IO(..)
, IOError(..)
, _mkIOok0
, _mkIOok1
, _mkIOok2
, _mkIOok3
, _mkIOok4
, _mkIOok5
, _mkIOok6
, _mkIOok7
, _mkIOok8
, _mkIOok9
, _mkIOok10
, _mkIOok11
, _mkIOok12
, _mkIOok13
, _mkIOok14
, _mkIOok15
, unsafePerformIO
-- Rational stuff
, Ratio(..)
, Rational
, (%)
-- error messages
, _patternMatchFail
, _noMethodError
, _recUpdError
, _recSelError
, _recConError
-- List syntax is un-rebindable, so always refers to Prelude lists
{-, []((:),[])-}
) where
import NHC.Internal -- Yes, it's circular! (needs a .hi to bootstrap)
import Prelude (($!),flip,id,error,undefined
,Char,String,Bool,Int,Integer,Float,Double
,(++),Either(..),(,),[](..),(),Show(show)
,Integral(..),gcd,Eq(..),Num(..))
import Ratio (Ratio(..),Rational,(%))
_apply1 f x = f x
_apply2 f x y = f x y
_apply3 f x y z = f x y z
_apply4 f x y z u = f x y z u
_id x = x
foreign import ccall "primIntegerEqC" _eqInteger :: Integer -> Integer -> Bool
foreign import ccall "primFloatEqC" _eqFloat :: Float -> Float -> Bool
foreign import ccall "primDoubleEqC" _eqDouble :: Double -> Double -> Bool
-- IO things
data World = World
newtype IO a = IO (World -> Either IOError a)
-- mkIOok functions lift any non-failing pure function to become a
-- monadic IO action, eliminating sharing of results etc.
-- These are intended to be applied by machine-generated code only.
-- Arities: 0-12
_mkIOok0 :: (()->a) -> IO a -- Note: no CAFs allowed!
_mkIOok1 :: (b->a) -> (b->IO a)
_mkIOok2 :: (c->b->a) -> (c->b->IO a)
_mkIOok3 :: (d->c->b->a) -> (d->c->b->IO a)
_mkIOok4 :: (e->d->c->b->a) -> (e->d->c->b->IO a)
_mkIOok5 :: (f->e->d->c->b->a) -> (f->e->d->c->b->IO a)
_mkIOok6 :: (g->f->e->d->c->b->a) -> (g->f->e->d->c->b->IO a)
_mkIOok7 :: (h->g->f->e->d->c->b->a) -> (h->g->f->e->d->c->b->IO a)
_mkIOok8 :: (i->h->g->f->e->d->c->b->a) -> (i->h->g->f->e->d->c->b->IO a)
_mkIOok9 :: (j->i->h->g->f->e->d->c->b->a) -> (j->i->h->g->f->e->d->c->b->IO a)
_mkIOok10 :: (k->j->i->h->g->f->e->d->c->b->a)
-> (k->j->i->h->g->f->e->d->c->b->IO a)
_mkIOok11 :: (l->k->j->i->h->g->f->e->d->c->b->a)
-> (l->k->j->i->h->g->f->e->d->c->b->IO a)
_mkIOok12 :: (m->l->k->j->i->h->g->f->e->d->c->b->a)
-> (m->l->k->j->i->h->g->f->e->d->c->b->IO a)
_mkIOok13 :: (n->m->l->k->j->i->h->g->f->e->d->c->b->a)
-> (n->m->l->k->j->i->h->g->f->e->d->c->b->IO a)
_mkIOok14 :: (o->n->m->l->k->j->i->h->g->f->e->d->c->b->a)
-> (o->n->m->l->k->j->i->h->g->f->e->d->c->b->IO a)
_mkIOok15 :: (p->o->n->m->l->k->j->i->h->g->f->e->d->c->b->a)
-> (p->o->n->m->l->k->j->i->h->g->f->e->d->c->b->IO a)
_mkIOok0 fn = IO (\_->Right $! fn ())
_mkIOok1 fn = \a-> IO (\_->Right $! fn a)
_mkIOok2 fn = \a b-> IO (\_->Right $! fn a b)
_mkIOok3 fn = \a b c-> IO (\_->Right $! fn a b c)
_mkIOok4 fn = \a b c d-> IO (\_->Right $! fn a b c d)
_mkIOok5 fn = \a b c d e-> IO (\_->Right $! fn a b c d e)
_mkIOok6 fn = \a b c d e f-> IO (\_->Right $! fn a b c d e f)
_mkIOok7 fn = \a b c d e f g-> IO (\_->Right $! fn a b c d e f g)
_mkIOok8 fn = \a b c d e f g h-> IO (\_->Right $! fn a b c d e f g h)
_mkIOok9 fn = \a b c d e f g h i-> IO (\_->Right $! fn a b c d e f g h i)
_mkIOok10 fn = \a b c d e f g h i j->
IO (\_->Right $! fn a b c d e f g h i j)
_mkIOok11 fn = \a b c d e f g h i j k->
IO (\_->Right $! fn a b c d e f g h i j k)
_mkIOok12 fn = \a b c d e f g h i j k l->
IO (\_->Right $! fn a b c d e f g h i j k l)
_mkIOok13 fn = \a b c d e f g h i j k l m->
IO (\_->Right $! fn a b c d e f g h i j k l m)
_mkIOok14 fn = \a b c d e f g h i j k l m n->
IO (\_->Right $! fn a b c d e f g h i j k l m n)
_mkIOok15 fn = \a b c d e f g h i j k l m n o->
IO (\_->Right $! fn a b c d e f g h i j k l m n o)
-- unsafePerformIO relies on the internal representation of the IO monad.
unsafePerformIO :: IO a -> a
unsafePerformIO (IO f) =
case f World of
Left err -> error ("unsafePerformIO: "++show err)
Right a -> a
{-
-- Rational stuff, required in the Prelude because of literal numbers.
data Ratio a = a :% a
type Rational = Ratio Integer
infixl 7 %
(%) :: (Integral a) => a -> a -> Ratio a
x % 0 = error "Ratio.%: zero denominator"
x % y = let top = x * signum y
bot = abs y
d = gcd top bot
in (top`quot`d) :% (y`quot`d)
-}
-- some error messages
_patternMatchFail s = error ("Pattern-match failure: "++s)
_noMethodError s = error ("No class method defined: "++s)
_recUpdError s = error ("Record update failed: "++s)
_recSelError s = error ("Record selection failed: "++s)
_recConError s = error ("Record construction failed: "++s)
|