{-# LANGUAGE CPP #-}
module Graphics.PDF.Data.Trie(
MapString(..)
, lookup
, insert
, fromList
)
where
import Prelude hiding(lookup)
import qualified Data.Map.Strict as M
import qualified Data.Text as T
data MapString v = EmptyTrie
| Trie (Maybe v) (M.Map Char (MapString v))
deriving(Eq,Show)
myLookup :: Ord k => k -> M.Map k a ->[a]
myLookup k d = case M.lookup k d of
Just r -> [r]
_ -> []
fromList :: [(T.Text,v)] -> MapString v
fromList = foldr addElem EmptyTrie
where
addElem (key,v) a = insert key v a
lookup :: T.Text
-> MapString v
-> [v]
lookup _ EmptyTrie = []
lookup t (Trie (Just tn) tc) | T.null t = [tn]
| otherwise =
let c = T.head t
s = T.tail t
in
tn:(myLookup c tc >>= lookup s)
lookup t (Trie Nothing tc) | T.null t = []
| otherwise =
let c = T.head t
s = T.tail t
in
myLookup c tc >>= lookup s
insert :: T.Text
-> v
-> MapString v
-> MapString v
insert t v EmptyTrie | T.null t = Trie (Just v) M.empty
| otherwise =
let k = T.head t
l = T.tail t
in
Trie Nothing (M.singleton k (insert l v EmptyTrie))
insert t v (Trie tn tc) | T.null t = Trie (Just v) tc
| otherwise =
let k = T.head t
s = T.tail t
in
case M.lookup k tc of
Nothing -> Trie tn (M.insert k (insert s v EmptyTrie) tc)
Just f -> Trie tn (M.insert k (insert s v f) tc)