module Memo(Memo,initM,listM,fromListM,elemM,lookupM,addM) where
import Tree234
newtype Memo a = Memo (Tree a)
initM :: Memo a
initM = Memo initTree
listM :: Memo a -> [a]
listM (Memo m) = treeMapList (:) m
fromListM :: Ord a => [a] -> Memo a
fromListM es = foldl addM initM es
elemM :: Ord a => Memo a -> a -> Bool
elemM (Memo tree) value =
treeSearch False (\_ -> True) (compare value) tree
lookupM :: Ord a => Memo a -> a -> Maybe a
lookupM (Memo tree) value =
treeSearch Nothing Just (compare value) tree
addM :: Ord a => Memo a -> a -> Memo a
addM (Memo tree) value =
Memo $ treeAdd comb compare value tree
where
comb a b = b
|