module Graphene.Instances(
Graph(..),
emptyGraph
)where
import Lens.Family2
import Data.Bifunctor
import qualified Data.Foldable as F
import Data.Bifoldable
import Data.Traversable
import Data.Monoid
import Graphene.Class
emptyGraph :: Graph e v
emptyGraph = Graph [] []
instance Functor (Graph e) where
fmap f (Graph vs es) = Graph (map f vs) (map (\(e, (v1, v2)) -> (e, (f v1, f v2))) es)
instance Bifunctor Graph where
bimap f g (Graph vs es) = Graph (map g vs) (map (\(e, (v1, v2)) -> (f e, (g v1, g v2))) es)
instance F.Foldable (Graph e) where
foldMap f = F.foldMap f . view vertices
instance Bifoldable Graph where
bifoldMap f g (Graph vs es) = F.foldMap (f . fst) es <> (F.foldMap g vs)
instance Monoid (Graph v e) where
mempty = emptyGraph
g `mappend` h = Graph (g^.vertices ++ h^.vertices) (g^.edges ++ h^.edges)