{-# OPTIONS -fglasgow-exts #-}
import GlaExts;
import Complex;
import Array;
type Complex_type = Complex Double;
type Array_type b = Array Int b;
type Assoc_type a = (Int,a);
type Descr_type = (Int,Int);
w2i x = word2Int# x;
i2w x = int2Word# x;
abortstr str = error ("abort:" ++ str);
delay x = abortstr "delay not implemented";
fix :: (x -> x) -> x;
fix f = fix_f where {fix_f = f fix_f};
force x = x; -- error "force not implemented"
iff :: Bool -> x -> x -> x;
iff b x y = if b then x else y;
iffrev :: x -> x -> Bool -> x;
iffrev y x b = if b then x else y;
miraseq :: x -> y -> y;
miraseq x y = seq_const y x; -- x should be marked #STRICT
seq_const x y = x;
pair :: [x] -> Bool;
pair [] = False;
pair x = True;
entier :: Double -> Double;
entier x = fromIntegral (floor x);
land_i :: Int -> Int -> Int;
land_i (I# x) (I# y) = I# (w2i (and# (i2w x) (i2w y)));
lnot_i :: Int -> Int;
lnot_i (I# x) = I# (w2i (not# (i2w x)));
lor_i :: Int -> Int -> Int;
lor_i (I# x) (I# y) = I# (w2i (or# (i2w x) (i2w y)));
lshift_i :: Int -> Int -> Int;
lshift_i (I# x) (I# y) = I# (w2i (shiftL# (i2w x) y));
rshift_i :: Int -> Int -> Int;
rshift_i (I# x) (I# y) = I# (w2i (shiftRL# (i2w x) y));
write x = abortstr "write not implemented";
descr :: Int -> Int -> Descr_type;
descr l u = (l,u);
destr_update :: Array_type x -> Int -> x -> Array_type x;
destr_update ar i x = ar // [(i,x)];
indassoc :: Assoc_type x -> Int;
indassoc (i,v) = i;
lowbound :: Descr_type -> Int;
lowbound (l,u) = l;
tabulate :: (Int -> x) -> Descr_type -> Array_type x;
tabulate f (l,u) = array (l,u) [(i, f i) | i <- [l..u]];
upbound :: Descr_type -> Int;
upbound (l,u) = u;
update :: Array_type x -> Int -> x -> Array_type x;
update ar i x = ar // [(i,x)];
valassoc :: Assoc_type x -> x;
valassoc (i,v) = v;