packages feed

graphmod-1.2: src/Trie.hs

module Trie where

import qualified Data.Map as Map
import Data.Maybe(fromMaybe)

data Trie a b = Sub (Map.Map a (Trie a b)) (Maybe b)
                deriving Show

empty :: Trie a b
empty = Sub Map.empty Nothing

lookup :: Ord a => [a] -> Trie a b -> Maybe b
lookup [] (Sub _ b)       = b
lookup (k:ks) (Sub as _)  = Trie.lookup ks =<< Map.lookup k as

insert :: (Ord a) => [a] -> (Maybe b -> b) -> Trie a b -> Trie a b
insert [] f (Sub as b)     = Sub as (Just (f b))
insert (k:ks) f (Sub as b) = Sub (Map.alter upd k as) b
  where upd j = Just $ insert ks f $ fromMaybe empty j