dag-0.0.2: src/Data/Graph/DAG.hs
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Graph.DAG
( module Data.Graph.DAG.Edge
, module Data.Graph.DAG.Edge.Utils
, DAG (..)
, glookup
) where
import Data.Graph.DAG.Edge
import Data.Graph.DAG.Edge.Utils
import Data.List (lookup)
-- | The graph may be not connected
data DAG es a where
GNil :: forall es a x unique. EdgeSchema es x unique
-> DAG es a
GCons :: String
-> a -- value
-> DAG es a
-> DAG es a
{-
-- | Convenience function.
getEdgeSchema :: DAG es a -> EdgeSchema es x unique
getEdgeSchema (GNil e) = (e :: EdgeSchema es x unique)
getEdgeSchema (GCons _ _ gs) = getEdgeSchema gs
-}
instance Functor (DAG es) where
fmap f (GNil e) = GNil e
fmap f (GCons k x xs) = GCons k (f x) $
fmap f xs
-- | A simple @Data.Map.lookup@ duplicate.
glookup :: String -> DAG es a -> Maybe a
glookup _ (GNil _) = Nothing
glookup k (GCons k2 a gs) | k == k2 = Just a
| otherwise = glookup k gs
{-
gtree :: String -> DAG es a -> Maybe (Tree a)
gtree k g = lookup k $ force $ reflect $ getSpanningTrees $ getEdgeSchema g
-}