-------------------------------------------------------------------------------- -- | -- Module : Data.PlanarGraph.AdjRep -- Copyright : (C) Frank Staals -- License : see the LICENSE file -- Maintainer : Frank Staals -- -- Data types that to represent a planar graph as Adjacency Lists. The main -- purpose is to help encode/decode a PlanarGraph as a JSON/YAML file. -- -------------------------------------------------------------------------------- module Data.PlanarGraph.AdjRep where import Data.Aeson import GHC.Generics (Generic) import Control.Lens(Bifunctor(..)) -------------------------------------------------------------------------------- -- | Data type representing the graph in its JSON/Yaml format data Gr v f = Gr { ajacencies :: [v] , faces :: [f] } deriving (Generic) instance Bifunctor Gr where bimap f g (Gr vs fs) = Gr (map f vs) (map g fs) instance (ToJSON v, ToJSON f) => ToJSON (Gr v f) where toEncoding = genericToEncoding defaultOptions instance (FromJSON v, FromJSON f) => FromJSON (Gr v f) ---------------------------------------- -- | A vertex, represented by an id, its adjacencies, and its data. data Vtx v e = Vtx { id :: Int , adj :: [(Int,e)] -- ^ adjacent vertices + data on the -- edge. Adjacencies are given in -- arbitrary order , vData :: v } deriving (Generic) instance Bifunctor Vtx where bimap f g (Vtx i as x) = Vtx i (map (\(j,y) -> (j,g y)) as) (f x) instance (ToJSON v, ToJSON e) => ToJSON (Vtx v e) where toEncoding = genericToEncoding defaultOptions instance (FromJSON v, FromJSON e) => FromJSON (Vtx v e) ---------------------------------------- -- | Faces data Face f = Face { incidentEdge :: (Int,Int) -- ^ an edge (u,v) s.t. the face -- is right from (u,v) , fData :: f } deriving (Generic,Functor) instance ToJSON f => ToJSON (Face f) where toEncoding = genericToEncoding defaultOptions instance FromJSON f => FromJSON (Face f) --------------------------------------------------------------------------------