stacked-dag-0.1.0.2: Ascii DAG(Directed acyclic graph) for visualization of dataflow

Safe HaskellSafe
LanguageHaskell2010

StackedDag.Base

Synopsis

Documentation

data Symbol Source #

Instances
Eq Symbol Source # 
Instance details

Defined in StackedDag.Base

Methods

(==) :: Symbol -> Symbol -> Bool #

(/=) :: Symbol -> Symbol -> Bool #

Read Symbol Source # 
Instance details

Defined in StackedDag.Base

Show Symbol Source # 
Instance details

Defined in StackedDag.Base

Semigroup Symbol Source # 
Instance details

Defined in StackedDag.Base

Monoid Symbol Source # 
Instance details

Defined in StackedDag.Base

type Depth = Int Source #

type Dest = Int Source #

type Cur = Int Source #

type Pos = Int Source #

getDepthGroup :: Edges -> DepthGroup Source #

Grouping the nodes by the depth

>>> getDepthGroup sampledat
fromList [(0,[5]),(1,[3]),(2,[2,4,6]),(3,[0,1])]

pairs :: Map b (Set a) -> [(a, b)] Source #

reverseEdges :: Edges -> Edges Source #

Reverse the directions of edges

>>> sampledat
fromList [(0,fromList [2]),(1,fromList [2]),(2,fromList [3]),(3,fromList [5]),(4,fromList [3]),(6,fromList [3])]
>>> reverseEdges sampledat
fromList [(2,fromList [0,1]),(3,fromList [2,4,6]),(5,fromList [3])]

getNodes :: Edges -> Nodes Source #

Get nodes by edges

>>> getNodes sampledat
fromList [0,1,2,3,4,5,6]

moveOne :: [(NodeId, Cur, Dest)] -> [((NodeId, Cur, Dest), [(Symbol, Pos)])] Source #

Move nodes to next step

>>> moveOne [(0,0,4)]
[((0,2,4),[(SRight,1)])]
>>> moveOne [(0,0,4),(0,4,0)]
[((0,2,4),[(SRight,1)]),((0,2,0),[(SLeft,3)])]

takeNode :: Cur -> [((NodeId, Cur, Dest), [(Symbol, Pos)])] -> Maybe ((NodeId, Cur, Dest), [(Symbol, Pos)]) Source #

moveLeft' :: [((NodeId, Cur, Dest), [(Symbol, Pos)])] -> [((NodeId, Cur, Dest), [(Symbol, Pos)])] Source #

Move more nodes

>>> moveLeft' [((0,0,0),[(SHold,0)]),((1,0,0),[(SLeft,1)]),((2,2,0),[(SLeft,3)])]
[((0,0,0),[(SHold,0)]),((1,0,0),[(SLeft,1)]),((2,0,0),[(SLMove,2),(SLeft,3)])]
>>> moveLeft' [((0,0,0),[(SHold,0)]),((1,0,0),[(SLeft,1)]),((2,0,0),[(SLMove,2),(SLeft,3)]),((3,2,0),[(SLMove,4),(SLeft,5)])]
[((0,0,0),[(SHold,0)]),((1,0,0),[(SLeft,1)]),((2,0,0),[(SLMove,2),(SLeft,3)]),((3,0,0),[(SLMove,4),(SLeft,5)])]
>>> moveLeft' [((0,2,0),[(SLeft,3)])]
[((0,0,0),[(SLMove,1),(SLMove,2),(SLeft,3)])]

moveLeft :: [((NodeId, Cur, Dest), [(Symbol, Pos)])] -> [((NodeId, Cur, Dest), [(Symbol, Pos)])] Source #

Move more nodes

>>> moveLeft [((0,0,0),[(SHold,0)]),((1,0,0),[(SLeft,1)]),((2,2,0),[(SLeft,3)]),((3,4,0),[(SLeft,5)])]
[((0,0,0),[(SHold,0)]),((1,0,0),[(SLeft,1)]),((2,0,0),[(SLMove,2),(SLeft,3)]),((3,0,0),[(SLMove,4),(SLeft,5)])]

moveAll' :: [(NodeId, Cur, Dest)] -> [[(Symbol, Pos)]] -> [[(Symbol, Pos)]] Source #

Move nodes to the next depth

>>> moveAll' [(0,0,4)] []
[[(SRight,1)],[(SRight,3)]]
>>> moveAll' [(0,4,0)] []
[[(SLMove,1),(SLMove,2),(SLeft,3)]]
>>> moveAll' [(0,2,0)] []
[[(SLeft,1)]]
>>> moveAll' [(0,0,4),(0,4,0)] []
[[(SRight,1),(SLeft,3)],[(SRight,3),(SLeft,1)]]
>>> moveAll' [(0,0,4),(0,2,0)] []
[[(SRight,1),(SLeft,1)],[(SRight,3),(SHold,0)]]

withSpace :: [(Symbol, Pos)] -> [(Symbol, Pos)] Source #

Fill spaces

>>> withSpace [(SRight,1),(SLeft,3)]
[(SSpace,0),(SRight,1),(SSpace,2),(SLeft,3)]
>>> withSpace [(SRight,3),(SLeft,1)]
[(SSpace,0),(SLeft,1),(SSpace,2),(SRight,3)]

moveAllWithSpace :: [(NodeId, Cur, Dest)] -> [[(Symbol, Pos)]] Source #

Move nodes and fill spaces

>>> moveAllWithSpace [(0,0,4)]
[[(SSpace,0),(SRight,1)],[(SSpace,0),(SSpace,1),(SSpace,2),(SRight,3)]]
>>> moveAllWithSpace [(0,4,0)]
[[(SSpace,0),(SLMove,1),(SLMove,2),(SLeft,3)]]
>>> moveAllWithSpace [(0,0,4),(0,4,0)]
[[(SSpace,0),(SRight,1),(SSpace,2),(SLeft,3)],[(SSpace,0),(SLeft,1),(SSpace,2),(SRight,3)]]
>>> moveAllWithSpace [(0,4,0),(1,0,4)]
[[(SSpace,0),(SRight,1),(SSpace,2),(SLeft,3)],[(SSpace,0),(SLeft,1),(SSpace,2),(SRight,3)]]

addBypassNode'' :: Depth -> Edges -> DepthGroup' -> DepthGroup' Source #

Add bypass nodes

>>> edges = mkEdges [(0,[1,2]),(1,[2])]
>>> addBypassNode'' 2 edges (M.fromList [(0,([2],[])),(1,([1],[])),(2,([0],[]))])
fromList [(0,([2],[])),(1,([1],[0])),(2,([0],[]))]
>>> edges = mkEdges [(0,[1,3]),(1,[2]),(2,[3])]
>>> addBypassNode'' 3 edges (M.fromList [(0,([3],[])),(1,([2],[])),(2,([1],[])),(3,([0],[]))])
fromList [(0,([3],[])),(1,([2],[])),(2,([1],[0])),(3,([0],[]))]
>>> addBypassNode'' 2 edges (M.fromList [(0,([3],[])),(1,([2],[])),(2,([1],[0])),(3,([0],[]))])
fromList [(0,([3],[])),(1,([2],[0])),(2,([1],[0])),(3,([0],[]))]
>>> edges = mkEdges [(0,[1,2]),(1,[4]),(2,[3]),(3,[4])]
>>> addBypassNode'' 2 edges (M.fromList [(0,([4],[])),(1,([3,1],[])),(2,([2],[0])),(3,([0],[]))])
fromList [(0,([4],[])),(1,([3,1],[])),(2,([2],[0])),(3,([0],[]))]

maxDepth :: DepthGroup' -> Int Source #

Get a maximum of depth

>>> maxDepth (M.fromList [(0,([2],[])),(1,([1],[])),(2,([0],[]))])
2

addBypassNode' :: Edges -> DepthGroup' -> DepthGroup' Source #

Add bypass nodes

>>> edges = mkEdges [(0,[1,2]),(1,[2])]
>>> addBypassNode' edges (M.fromList [(0,([2],[])),(1,([1],[])),(2,([0],[]))])
fromList [(0,([2],[])),(1,([1],[0])),(2,([0],[]))]
>>> edges = mkEdges [(0,[1,3]),(1,[2]),(2,[3])]
>>> addBypassNode' edges (M.fromList [(0,([3],[])),(1,([2],[])),(2,([1],[])),(3,([0],[]))])
fromList [(0,([3],[])),(1,([2],[0])),(2,([1],[0])),(3,([0],[]))]

addBypassNode :: Edges -> DepthGroup -> DepthGroup' Source #

Add bypass nodes

>>> edges = mkEdges [(0,[1,2]),(1,[2])]
>>> dg = getDepthGroup edges
>>> addBypassNode edges dg
fromList [(0,([2],[])),(1,([1],[0])),(2,([0],[]))]
>>> edges = mkEdges [(0,[1,3]),(1,[2]),(2,[3])]
>>> dg = getDepthGroup edges
>>> addBypassNode edges dg
fromList [(0,([3],[])),(1,([2],[0])),(2,([1],[0])),(3,([0],[]))]
>>> edges = mkEdges [(0,[1,2]),(1,[4]),(2,[3]),(3,[4])]
>>> dg = getDepthGroup edges
>>> addBypassNode edges dg
fromList [(0,([4],[])),(1,([3,1],[])),(2,([2],[0])),(3,([0],[]))]

addPosNode :: Edges -> DepthGroup' -> DepthGroup'' Source #

Add destinations of nodes

>>> edges = mkEdges [(0,[1,2]),(1,[2])]
>>> dg = getDepthGroup edges
>>> addPosNode edges $ M.fromList [(0,([2],[])),(1,([1],[0])),(2,([0],[]))]
fromList [(0,([(2,0,0)],[])),(1,([(1,0,0)],[(0,2,0)])),(2,([(0,0,0),(0,0,2)],[]))]

addNode :: Edges -> DepthGroup -> DepthGroup'' Source #

Grouping the nodes by the depth

>>> edges = mkEdges [(0,[1,2])]
>>> dg = getDepthGroup edges
>>> dg
fromList [(0,[1,2]),(1,[0])]
>>> addNode edges dg
fromList [(0,([(1,0,0),(2,2,2)],[])),(1,([(0,0,0),(0,0,2)],[]))]

renderToText :: [[(Symbol, Pos)]] -> [String] -> String Source #

Rendering symbols to text

>>> renderToText [[(SNode "",0)],[(SHold,0)],[(SNode "",0)]] []
"o\n|\no\n"
>>> renderToText [[(SNode "",0),(SSpace,1),(SNode "",2)],[(SHold,0),(SLeft,1)],[(SNode "",0)]] []
"o o\n|/\no\n"

addPos :: Edges -> ([NodeId], [NodeId]) -> ([NodeId], [NodeId]) -> ([(NodeId, Cur, Dest)], [(NodeId, Cur, Dest)]) Source #

Allocate destinations of nodes.

>>> addPos sampledat ([0,1],[]) ([2],[])
([(0,0,0),(1,2,0)],[])
>>> addPos (mkEdges [(0,[1,2]),(1,[2])]) ([0],[]) ([1],[0])
([(0,0,0),(0,0,2)],[])
>>> addPos (mkEdges [(0,[1,2]),(1,[2])]) ([1],[0]) ([2],[])
([(1,0,0)],[(0,2,0)])
>>> addPos (mkEdges [(0,[1,3]),(1,[2]),(2,[3])]) ([1],[0]) ([2],[0])
([(1,0,0)],[(0,2,2)])