module Vtslib( Option(..) , Sum(..) , forall , exists , assoc ,
haskey , uncurry , curry , for , map' , module Core_datatype )
where
import Core_datatype
data Option a = NONE | SOME a
data Sum a b = Inl a | Inr b
{-
(* Apply the predicate p to all the elements of *)
(* a list, and then AND the results together. *)
N.B. forall & exists rewritten from ML
-}
forall :: ( a -> Bool ) -> [a] -> Bool
forall p = and . ( map p )
{-
(* Apply the predicate p to all the elements of *)
(* a list, and then OR the results together. *)
-}
exists :: ( a -> Bool ) -> [a] -> Bool
exists p = or . ( map p )
{-
(* Return the value stored in a association list *)
(* store under key. An association list is a *)
(* list of pairs (key, value) *)
-}
assoc :: ( Eq a ) => a -> [(a,b)] -> Option b
assoc key [] = NONE
assoc key ((key',entry):l')
| key == key' = SOME entry
| otherwise = assoc key l'
{-
(* Return whether an association list has a particular key. *)
-}
haskey key al
= case assoc key al of
SOME _ -> True
NONE -> False
{-
val op !! = nth
fun foldl f =
let fun fold e [] = e
| fold e (a::l) = fold (f a e) l
in fold end
fun foldr f e =
let fun fold [] = e
| fold (a::l) = f a (fold l)
in fold end
exception Reduce
fun reducel f [a] = a
| reducel f (a::b::l) = reducel f (f a b :: l)
| reducel f [] = raise Reduce
fun reducer f [a] = a
| reducer f (a::l) = f a (reducer f l)
| reducer f [] = raise Reduce
-}
{-
(* Return an uncurried version of a curried function *)
-}
--in 1.3: uncurry f (a,b) = f a b
{-
(* Return a curried version of an uncurried function *)
-}
--in 1.3: curry f a b = f (a,b)
for :: Int -> (b -> b) -> b -> b
for 0 f y = y
for i f y = for (i-1) f ( f y )
{-
fun str_to_int s =
let val s_len = size s
val zero_ord = fromEnum "0"
val nine_ord = fromEnum "9"
fun is_digit i = i >= zero_ord andalso i <= nine_ord
fun convert si i =
if si >= s_len
then i
else if is_digit (ordof (s,si)) then
convert (si + 1) (i * 10 - zero_ord + ordof (s,si))
else raise Str_to_int
in if s_len > 1 then
if ordof (s, 0) = fromEnum "~" then
~ (convert 1 0)
else
convert 0 0
else if s_len > 0 then
convert 0 0
else
raise Str_to_int
end
-}
map' :: (Int -> b -> c) -> [b] -> [c]
map' f = mapf 0
where
mapf i [] = []
mapf i (x:l) = f i x : mapf (i+1) l
|