{-# LANGUAGE UnicodeSyntax, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts, OverlappingInstances #-}
module GraphRewriting.Strategies.Control where

import Data.View
import GraphRewriting.Graph
--import GraphRewriting.Layout.PortSpec
import qualified Data.IntMap as Map

data Wrapper n = Wrapper {control :: Control, wrapped :: n}

data Control = Control {stack  [Node]} | NoControl

instance View Control (Wrapper n) where
	inspect = control
	update c n = n {control = c}

instance View v n  View v (Wrapper n) where
	inspect = inspect . wrapped
	update v n = n {wrapped = update v $ wrapped n}

-- | Wraps the nodes of a graph, augmenting them with control information
wrapGraph :: Graph n -> Graph (Wrapper n)
wrapGraph graph = graph {nodeMap = newNodeMap} where
		wrapNode n = Wrapper {control = NoControl, wrapped = n}
		rootNodeId = minimum (Map.keys $ nodeMap graph)
		controlgraph = unsafeMapNodes wrapNode graph
 		newNodeMap = Map.update (\x  Just $ x {control = Control []}) rootNodeId (nodeMap controlgraph)