packages feed

graph-rewriting-trs-0.1.4: Graph.hs

{-# 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