module AssocTree
( AssocTree
, Tree
, initAT -- :: AssocTree k v
, listAT -- :: AssocTree k v -> [(k,v)]
, reorderAT -- :: (AssocTree k v -> (j,u) -> AssocTree k v)
-- -> AssocTree j u -> AssocTree k v
, addAT -- :: Ord k =>
-- AssocTree k v -> (v->v->v) -> k -> v -> AssocTree k v
, lookupAT -- :: Ord a =>
-- AssocTree k v -> k -> Maybe v
, updateAT -- :: Ord k =>
-- AssocTree k v -> k -> (v->v) -> AssocTree k v
, mapAT -- :: (v -> w) -> AssocTree k v -> AssocTree k w
) where
import Tree234
newtype AssocTree k v = AssocTree (Tree (k,v))
instance (Show k, Show v) => Show (AssocTree k v) where
show t = show (listAT t)
initAT :: AssocTree k v
initAT = AssocTree initTree
listAT :: AssocTree k v -> [(k,v)]
listAT (AssocTree t) = treeMapList (:) t
reorderAT :: (AssocTree k v -> (j,u) -> AssocTree k v)
-> AssocTree j u -> AssocTree k v
reorderAT translate t =
foldl translate initAT (listAT t)
cmp1 key (key',value) = compare key key'
cmp2 key _ (key',value) = compare key key'
addAT :: Ord k => AssocTree k v -> (v->v->v) -> k -> v -> AssocTree k v
addAT (AssocTree t) comb key value =
AssocTree $ treeAdd combine (cmp2 key) (key,value) t
where
combine (k1,v1) (k2,v2) = (k2,comb v1 v2)
lookupAT :: Ord k => AssocTree k v -> k -> Maybe v
lookupAT (AssocTree t) key =
treeSearch Nothing ok (cmp1 key) t
where
ok (key,value) = Just value
updateAT :: Ord k => AssocTree k v -> k -> (v->v) -> AssocTree k v
updateAT (AssocTree t) key upd =
AssocTree $ treeUpdate update (cmp1 key) t
where
update (k1,v1) = (k1,upd v1)
mapAT :: (v -> w) -> AssocTree k v -> AssocTree k w
mapAT f (AssocTree t) = AssocTree $ treeMap (\(k, v) -> (k, f v)) t
|