packages feed

tables-0.4: examples/Graph.hs

{-# Language TemplateHaskell #-}
{-# Language TypeFamilies #-}
{-# Language GADTs #-}
{-# Language GeneralizedNewtypeDeriving #-}
{-# Language RankNTypes #-}
-- base
import Control.Applicative
-- containers
import Data.Set (Set)
import qualified Data.Set as S
-- lens
import Control.Lens
-- tables
import Data.Table

data Node = Node
  { _name :: Int
  , _arcs :: Set Int
  } deriving (Show)
makeLenses ''Node

instance Tabular Node where
  type PKT Node = Int
  data Key k Node b where
    Key  :: Key Primary Node Int
    Arcs :: Key Inverted Node (Set Int)
  data Tab Node i = NTab (i Primary Int)
    (i Inverted (Set Int))
  fetch Key = _name
  fetch Arcs = _arcs
  primary = Key
  primarily Key r = r
  mkTab f = NTab <$> f Key <*> f Arcs
  forTab (NTab i s) f = NTab <$> f Key i <*> f Arcs s
  ixTab (NTab i _) Key = i
  ixTab (NTab _ s) Arcs = s

main :: IO ()
main = do
  -- Make a lot of graph nodes.
  let t = fromList
        [ Node 1 (S.fromList [1, 2, 3])
        , Node 2 (S.fromList [1, 2, 3])
        , Node 3 (S.fromList [1, 2])
        , Node 4 (S.fromList [5])
        , Node 5 (S.fromList [4])
        , Node 6 (S.fromList [3])
        ]
  -- Print the names of all the nodes pointing to #3.
  print $ t ^.. withAny Arcs [3] . folded . name
  -- Print the names of all the nodes pointing to both #1 and #2.
  print $ t ^.. withAll Arcs [1, 2] . folded . name