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