module GraphRewriting.Layout.Wrapper
(Wrapper (..), wrapGraph, wrappee, updateWrappee,
module Data.View,
module GraphRewriting.Graph.Types,
module GraphRewriting.Layout.Position,
module GraphRewriting.Layout.PortSpec,
module GraphRewriting.Layout.Rotation,
module GraphRewriting.Layout.RotPortSpec,
module Data.Vector.V2)
where
import Data.View
import GraphRewriting.Graph
import GraphRewriting.Graph.Types
import GraphRewriting.Layout.Position
import GraphRewriting.Layout.PortSpec
import GraphRewriting.Layout.Rotation
import GraphRewriting.Layout.RotPortSpec
import Data.Vector.Class
import Data.Vector.V2
data Wrapper w = Wrapper {wRot ∷ Rotation, wPos ∷ Position, wrappee ∷ w}
instance View v n ⇒ View v (Wrapper n) where
inspect = inspect . wrappee
adjust f w = w {wrappee = adjust f $ wrappee w}
instance PortSpec n ⇒ PortSpec (Wrapper n) where portSpec = portSpec . wrappee
instance View Rotation (Wrapper n) where
inspect = wRot
update v w = w {wRot = v}
instance View Position (Wrapper n) where
inspect = wPos
update v w = w {wPos = v}
updateWrappee v n = n {wrappee = v}
wrapGraph ∷ Graph n → Graph (Wrapper n)
wrapGraph = unsafeMapNodesUnique wrapNode where
wrapNode k n = Wrapper {wRot = Rotation 0, wPos = Position $ genPos k, wrappee = n}
genPos k = rotate (fromIntegral k) (vpromote f)
where f = fromIntegral $ k `mod` 3