Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Synopsis
- type NodeId = Int
- type Edges = Map NodeId (Set NodeId)
- type Labels = Map NodeId String
- data Symbol
- type Nodes = Set NodeId
- type Depth = Int
- type Dest = Int
- type Cur = Int
- type Pos = Int
- type DepthNode = Map NodeId Depth
- type DepthGroup = Map Depth [NodeId]
- type NodeDepth = Map NodeId Depth
- type DepthGroup' = Map Depth ([NodeId], [NodeId])
- type DepthGroup'' = Map Depth ([(NodeId, Cur, Dest)], [(NodeId, Cur, Dest)])
- mkEdges :: [(NodeId, [NodeId])] -> Edges
- mkLabels :: [(NodeId, String)] -> Labels
- sampledat :: Edges
- samplelabels :: Labels
- getDepthGroup :: Edges -> DepthGroup
- getNodeDepth :: DepthGroup -> NodeDepth
- pairs :: Map b (Set a) -> [(a, b)]
- reverseEdges :: Edges -> Edges
- getNodes :: Edges -> Nodes
- getDepth2 :: Edges -> DepthNode
- getDepth2' :: STRef s DepthNode -> Int -> Edges -> ST s Int
- moveOne :: [(NodeId, Cur, Dest)] -> [((NodeId, Cur, Dest), [(Symbol, Pos)])]
- takeNode :: Cur -> [((NodeId, Cur, Dest), [(Symbol, Pos)])] -> Maybe ((NodeId, Cur, Dest), [(Symbol, Pos)])
- moveLeft' :: [((NodeId, Cur, Dest), [(Symbol, Pos)])] -> [((NodeId, Cur, Dest), [(Symbol, Pos)])]
- moveLeft :: [((NodeId, Cur, Dest), [(Symbol, Pos)])] -> [((NodeId, Cur, Dest), [(Symbol, Pos)])]
- moveAll' :: [(NodeId, Cur, Dest)] -> [[(Symbol, Pos)]] -> [[(Symbol, Pos)]]
- mergeSymbol :: [(Symbol, Pos)] -> [(Symbol, Pos)]
- withSpace :: [(Symbol, Pos)] -> [(Symbol, Pos)]
- moveAllWithSpace :: [(NodeId, Cur, Dest)] -> [[(Symbol, Pos)]]
- lstr :: Labels -> NodeId -> String
- nodeWithSpace :: Labels -> ([(NodeId, Cur, Dest)], [(NodeId, Cur, Dest)]) -> [(Symbol, Pos)]
- addBypassNode'' :: Depth -> Edges -> DepthGroup' -> DepthGroup'
- maxDepth :: DepthGroup' -> Int
- addBypassNode' :: Edges -> DepthGroup' -> DepthGroup'
- addBypassNode :: Edges -> DepthGroup -> DepthGroup'
- addPosNode :: Edges -> DepthGroup' -> DepthGroup''
- addNode :: Edges -> DepthGroup -> DepthGroup''
- toSymbol :: Labels -> DepthGroup'' -> [[(Symbol, Pos)]]
- edgesToText :: Labels -> Edges -> String
- symbolToChar :: Symbol -> Char
- renderToText :: [[(Symbol, Pos)]] -> [String] -> String
- getLongestCommonPrefix' :: String -> String -> String -> String
- getLongestCommonPrefix :: [String] -> String
- addPos :: Edges -> ([NodeId], [NodeId]) -> ([NodeId], [NodeId]) -> ([(NodeId, Cur, Dest)], [(NodeId, Cur, Dest)])
Documentation
getDepthGroup :: Edges -> DepthGroup Source #
Grouping the nodes by the depth
>>>
getDepthGroup sampledat
fromList [(0,[5]),(1,[3]),(2,[2,4,6]),(3,[0,1])]
getNodeDepth :: DepthGroup -> NodeDepth 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)]]
nodeWithSpace :: Labels -> ([(NodeId, Cur, Dest)], [(NodeId, Cur, Dest)]) -> [(Symbol, Pos)] Source #
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)],[]))]
symbolToChar :: Symbol -> Char Source #
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"
getLongestCommonPrefix :: [String] -> String Source #
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)])