{
Let G. make
}
Where
Let make MAP.
Let compare. MAP.compare
In
Let ADJ.
{
Let vertex item. item.0
Let neighbors item. item.1
}
Let SET. (SEARCH.SET compare)
In
Let min a b. If (a < b) a b
In
Define traverse g adj i stack preorder assigned components.
Let v. (ADJ.vertex adj)
Let neighbors. (ADJ.neighbors adj)
In
Let preorder. (MAP.insert preorder {v i})
Let stack. (v::stack)
In
Let {link i' stack preorder assigned components}.
(LIST.reduce neighbors
{i (i + 1) stack preorder assigned components}
Func state w.
Let {link i stack preorder assigned components}. state
In
Match (SET.search assigned w)
| `just._ state
| `nothing
Match (MAP.search preorder w)
| `just.{_ j}
Let link. (min link j)
In
{link i stack preorder assigned components}
| `nothing
Let adj.
Match (MAP.search g w)
| `nothing {w []}
| `just.adj adj
;
In
Let {link' i stack preorder assigned components}.
(traverse g adj i stack preorder assigned
components)
In
Let link. (min link link')
In
{link i stack preorder assigned components}
;
;)
In
If (i = link)
Block
Let {c stack assigned}.
Begin (gathering [] stack assigned)
Define gathering c stack assigned.
Match stack
| `cons.{w stack}
Let assigned. (SET.insert assigned w)
In
Match (compare w v)
| `equal {(v::c) stack assigned}
| _ Goto (gathering (w::c) stack assigned)
;
;
In
{link i' stack preorder assigned (c::components)}
{link i' stack preorder assigned components}
In
Define traversing g adjs i stack preorder assigned components.
Match adjs
| `nil (LIST.reverse components)
| `cons.{adj adjs}
Match (SET.search assigned (ADJ.vertex adj))
| `just._
Goto (traversing g adjs i stack preorder assigned components)
| `nothing
Let {link i stack preorder assigned components}.
(traverse g adj i stack preorder assigned components)
In
Goto (traversing g adjs i stack preorder assigned components)
;
;
In
{
Let strongly_connected_components g.
(traversing g (MAP.list g) 0 [] MAP.empty SET.empty [])
}
Where
Let die. OS.die
Where
Let LIST. Package "list"
Let OS. Package "os"
Let SEARCH. Package "search"
Let STDIO. Package "stdio"