module Prelude where
import Subtract
class Enum a where
succ, pred :: a -> a
toEnum :: Int -> a
fromEnum :: a -> Int
enumFrom :: a -> [a] -- [n..]
enumFromThen :: a -> a -> [a] -- [n,n'..]
enumFromTo :: a -> a -> [a] -- [n..m]
enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
succ = toEnum . (+1) . fromEnum
pred = toEnum . subtract 1 . fromEnum
enumFrom n = n : enumFrom (succ n)
enumFromThen n m = let ni = fromEnum n
mi = fromEnum m
step = mi - ni
inc s i = toEnum s : inc (s+i) i
dec s i = toEnum s : dec (s-i) i
in if step >=0 then inc ni step
else dec ni step
enumFromTo n m = let ni = fromEnum n
mi = fromEnum m
in
case compare ni mi of
LT -> _enumFromToIncC ni 1 mi
EQ -> n:[]
GT -> []
enumFromThenTo n n' m = let ni = fromEnum n
ni' = fromEnum n'
mi = fromEnum m
step = ni' - ni
in
if step >= 0 then
_enumFromToIncC ni step mi
else
_enumFromToDecC ni step mi
_enumFromToDecC :: (Enum a) => Int -> Int -> Int -> [a]
_enumFromToDecC n s m =
case compare n m of
LT -> []
EQ -> toEnum n : []
GT -> toEnum n : _enumFromToDecC (n+s) s m
_enumFromToIncC :: (Enum a) => Int -> Int -> Int -> [a]
_enumFromToIncC n s m =
case compare n m of
LT -> toEnum n : _enumFromToIncC (n+s) s m
EQ -> toEnum n : []
GT -> []
|