{-# LANGUAGE UnicodeSyntax, FlexibleInstances, MultiParamTypeClasses #-} module Graph where import Data.View import GraphRewriting.Graph import GraphRewriting.Graph.Write import Term import Data.Maybe (listToMaybe) data Vertex = Applicator {inp, out1, out2 ∷ Port} | Variable {inp ∷ Port, name ∷ Char} | Root {out ∷ Port} instance View [Port] Vertex where inspect node = case node of Applicator {inp = i, out1 = o1, out2 = o2} → [i,o1,o2] Variable {inp = i} → [i] Root {out = o} → [o] update ports node = case node of Applicator {} → node {inp = i, out1 = o1, out2 = o2} where [i,o1,o2] = ports Variable {} → node {inp = i} where [i] = ports Root {} → node {out = o} where [o] = ports fromTerm ∷ Term → Graph Vertex fromTerm term = flip execGraph emptyGraph $ do e ← compile term newNode Root {out = e} compile ∷ Term → Rewrite Vertex Edge compile term = do e ← newEdge _ ← case term of Var v → newNode Variable {inp = e, name = v} App f x → do ef ← compile f ex ← compile x newNode Applicator {inp = e, out1 = ef, out2 = ex} return e maybeRead :: Read a => String -> Maybe a maybeRead = fmap fst . listToMaybe . reads