--- /dev/null
+{-# LANGUAGE
+ EmptyDataDecls,
+ TypeFamilies,
+ UndecidableInstances
+ #-}
+module Types.Data.Graph
+ ( Context
+ , Decomp
+ , LNode
+ , LPath
+ , Graph
+
+ , Empty
+ , IsEmpty
+
+ , Match
+ )
+ where
+
+import qualified Types.Data.List as L
+import qualified Types.Data.List.Ops as L
+import qualified Types.Data.Map as M
+
+import Types.Data.Bool
+import Types.Data.Maybe
+
+
+-- preNodes, sucNodes: map from node ID to edge label
+data Context preNodes nodeID nodeLabel sucNodes
+
+-- nodeMap: map from node ID to context
+data Graph nodeMap
+
+-- mContext: Maybe Context
+data Decomp mContext graph
+
+-- nodeID: natural number
+data LNode nodeID nodeLabel
+
+-- lNodes: list of LNode
+data LPath lNodes
+
+-- Empty
+type Empty = Graph M.Empty
+
+-- IsEmpty
+type family IsEmpty g
+type instance IsEmpty (Graph m) = M.Null m
+
+-- Match
+type Match node g = Match' (M.Lookup node g) node g
+
+type family Match' mContext node g
+type instance Match' Nothing node g = Decomp Nothing g
+type instance Match' (Just (Context p node' label s)) node g
+ = Decomp (Just (Context (M.Delete node p)
+ node
+ label
+ (M.Delete node s)))
+ (ClearSucc (ClearPred (M.Delete node g)
+ node
+ (M.Keys (M.Delete node s)))
+ node
+ (M.Keys (M.Delete node p)))
+
+-- ClearSucc
+type family ClearSucc g n ns
+type instance ClearSucc g n L.Null = g
+type instance ClearSucc g n (L.Cons s ss)
+ = ClearSucc (M.Adjust (ClearSucc' n) s g) n ss
+
+data ClearSucc' n
+type instance L.App (ClearSucc' n) (Context ps n' l ss)
+ = Context ps n' l (M.Delete n ss)
+
+-- ClearPred
+type family ClearPred g n ns
+type instance ClearPred g n L.Null = g
+type instance ClearPred g n (L.Cons p ps)
+ = ClearPred (M.Adjust (ClearPred' n) p g) n ps
+
+data ClearPred' n
+type instance L.App (ClearPred' n) (Context ps n' l ss)
+ = Context (M.Delete n ps) n' l ss