module Data.DAWG.Dynamic.Node
( Node(..)
, onSym
, edges
, children
, insert
) where
import Control.Applicative ((<$>), (<*>))
import Data.Binary (Binary, Get, put, get)
import Data.DAWG.Types
import Data.DAWG.Util (combine)
import Data.DAWG.HashMap (Hash, hash)
import Data.DAWG.Trans.Map (Trans)
import qualified Data.DAWG.Trans as T
import qualified Data.DAWG.Trans.Hashed as H
data Node a
= Branch {
eps :: !ID
, transMap :: !(H.Hashed Trans) }
| Leaf { value :: !(Maybe a) }
deriving (Show, Eq, Ord)
instance Ord a => Hash (Node a) where
hash Branch{..} = combine eps (H.hash transMap)
hash Leaf{..} = case value of
Just _ -> (1)
Nothing -> (2)
instance Binary a => Binary (Node a) where
put Branch{..} = put (1 :: Int) >> put eps >> put transMap
put Leaf{..} = put (2 :: Int) >> put value
get = do
x <- get :: Get Int
case x of
1 -> Branch <$> get <*> get
_ -> Leaf <$> get
onSym :: Sym -> Node a -> Maybe ID
onSym x (Branch _ t) = T.lookup x t
onSym _ (Leaf _) = Nothing
edges :: Node a -> [(Sym, ID)]
edges (Branch _ t) = T.toList t
edges (Leaf _) = []
children :: Node a -> [ID]
children = map snd . edges
insert :: Sym -> ID -> Node a -> Node a
insert x i (Branch w t) = Branch w (T.insert x i t)
insert _ _ l = l