<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

### Table of Contents

-   [check](#check)
-   [frontiers_from_preds](#frontiers_from_preds)
-   [frontiers_from_succs](#frontiers_from_succs)
-   [normalize](#normalize)
-   [condRefToSelf](#condreftoself)
-   [simpleRefToSelf](#simplereftoself)
-   [create_j_edges](#create_j_edges)
-   [create_levels](#create_levels)
-   [create_nodes](#create_nodes)
-   [create_dj_graph](#create_dj_graph)
-   [GraphNode](#graphnode)
-   [DomWalkerOptions](#domwalkeroptions)
-   [make_dom](#make_dom)
-   [alternative_idf](#alternative_idf)
-   [forIteratedDominanceFrontier](#foriterateddominancefrontier)
-   [iteratedDominanceFrontier](#iterateddominancefrontier)
-   [forStrictDominators](#forstrictdominators)
-   [forStrictDominators](#forstrictdominators-1)
-   [forDominators](#fordominators)
-   [strictDominators](#strictdominators)
-   [dominators](#dominators)
-   [strictlyDominates](#strictlydominates)
-   [strictlyDominates](#strictlydominates-1)
-   [dominates](#dominates)
-   [forStrictlyDominates](#forstrictlydominates)
-   [forDominates](#fordominates)
-   [forDominanceFrontier](#fordominancefrontier)
-   [forDominanceFrontier](#fordominancefrontier-1)
-   [dominanceFrontier](#dominancefrontier)
-   [forPrunedIteratedDominanceFrontier](#forprunediterateddominancefrontier)
-   [lt](#lt)
-   [iterative](#iterative)
-   [nsuccs](#nsuccs)

## 

Description of file here.

**Meta**

-   **since**: 1.0.0
-   **author**: Julian Jensen &lt;jjdanois@gmail.com>

## 

Calculates dominanace frontiers from a dominator tree.

**Meta**

-   **since**: 1.0.0
-   **author**: Julian Jensen &lt;jjdanois@gmail.com>

## check

Find dominance frontiers

**Parameters**

-   `vertices` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?>** 

## frontiers_from_preds

Find dominance frontiers

**Parameters**

-   `preds` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?>** 

## frontiers_from_succs

Find dominance frontiers

**Parameters**

-   `succs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?>** 

## 

Utilities for graph manipulation.

**Meta**

-   **author**: Julian Jensen &lt;jjdanois@gmail.com>

## normalize

**Parameters**

-   `nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;([Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)> | [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number))>** 

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 

## condRefToSelf

**Parameters**

-   `seed` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `chk` **function ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)): [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?**  (optional, default `twoOrMore`)
-   `dest` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?**  (optional, default `arrayOfArrays(seed)`)

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** }

## simpleRefToSelf

**Parameters**

-   `seed` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `dest` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?**  (optional, default `arrayOfArrays(seed)`)

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** }

## create_j_edges

-   **See: create_dj_graph**

This will create and return the J-edges of a graph. The J-edges, or Join edges,
make up one-half of the DJ-graph. For more information read the documentation
for the DJ-graph.

You need only pass the nodes of the graph to this function. The rest of the parameters
are optional and will be computed if not provided. I allow the options to pass them
in case you already have them calculated from elsewhere, just to make things a bit faster.
If no arguments are provided other than the basic vertices, it will compute the immediate
dominators, create the dominator tree, and compute the levels, and discard all of those results.
Not a big deal unless you're dealing with very large graphs, in which case you should
calculate those separately and provide them as inputs here.

**Parameters**

-   `_nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** An array of arrays of successors indices, as always
-   `domLevels` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>?** The levels (or depth) of the nodes in the dominator tree
-   `domTree` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?** The dominator tree in the standard format, same as \_nodes
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>?** The immediate dominators

Returns **any** 

## create_levels

Calculate the level of each node in terms of how many edges it takes to reach
the root. For the sake of simplicity, this uses a BFS to compute depth values.

**Parameters**

-   `nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** The graph

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** An array of depth (i.e. level) numbers

## create_nodes

-   **See: GraphNode**

A convenience method. It returns an array of object, one for each nodes in the graph,
and in that order, that holds most of the information you could want for working
with graphs.

Specifically, each node looks as descibed in the typedef for GraphNode.

**Parameters**

-   `_nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** The usual graph nodes
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>?** The immediate dominators, if not provided, they will be computed

## create_dj_graph

Returns a DJ-graph which is a graph that consts of the dominator tree and select
join edges from the input graph.

**Parameters**

-   `nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** Graph in the usual format
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>?** Immediate dominators, if omiteed, they will be computed
-   `domTree` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?** Dominator tree, it omitted, will be computed

## 

Utilities for working with dominators and their frontiers.

**Meta**

-   **since**: 1.0.0
-   **author**: Julian Jensen &lt;jjdanois@gmail.com>

## GraphNode

Type: [object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Properties**

-   `id` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** The index of this node in the original array
-   `succs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** The successor node indices
-   `preds` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** The predecessor node indices
-   `domSuccs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** The dominator tree successor indices
-   `idom` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** The immediate dominator and, of course, dominator tree predecessor
-   `level` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** The depth (or level) of the vertex
-   `domLevel` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** The depth in the dominator tree
-   `jSuccs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** The successor J-edges, if any, of this node
-   `jPreds` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** The predecessor J-edges, if any, of this node

## DomWalkerOptions

Type: [object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Properties**

-   `nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `idoms` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?>?** 
-   `domTree` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?** 
-   `jEdges` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?** 
-   `frontiers` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>?** 
-   `djGraph` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>>?** 
-   `domLevels` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>?** 

## make_dom

This will associated a graph with a number of useful utility functions. It will return an
object with a variety of functions that operate on the graphs.

You might notice that many of these functions I took from the WebKit `dominators.h` file, which
I really liked, and, although I re-wrote the code completely (obviously, since it was in `C++`), I decided
to keep their comments with a few small alterations or corrections. I decided to not use their iterated dominance frontier
code, because it was as efficient as it could be. Instead, I implemented one that uses a DJ-graph
that I found in Chapter 4 of "The SSA Book," called "Advanced Contruction Algorithms for SSA" by
_D. Das_, _U. Ramakrishna_, _V. Sreedhar_. That book doesn't seem to be published or, if it has, I've
missed it. You can build the book yourself, supposedly, (I couldn't make that work, though) from here: [SSA Book](https://gforge.inria.fr/scm/?group_id=1950)
or you can probably find a PDF version of it somewhere on the web, which is what I did.

**Parameters**

-   `opts` **([DomWalkerOptions](#domwalkeroptions) \| [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>)** 

**Examples**

```javascript
const myGraph = make_dom( graph );

myGraph.forStrictDominators( n => console.log( `${n} is a strict dominator of 9` ), 9 );
```

```javascript
if ( myGraph.strictlyDominates( 7, 9 ) )
    console.log( `7 strictly dominates 9` );
```

```javascript
console.log( `Node at index 7 strictly dominates these: ${myGraph.strictlyDominates( 7 ).join( ', ' )}` );
console.log( `The strict dominators of 7 are ${myGraph.strictDominators( 7 ).join( ', ' )}` );
```

Returns **{forStrictDominators: [forStrictDominators](#forstrictdominators), forDominators: [forDominators](#fordominators), strictDominators: [strictDominators](#strictdominators), dominators: [dominators](#dominators), forStrictlyDominates: [forStrictlyDominates](#forstrictlydominates), forDominates: [forDominates](#fordominates), strictlyDominates: [strictlyDominates](#strictlydominates), dominates: [dominates](#dominates), forDominanceFrontier: [forDominanceFrontier](#fordominancefrontier), dominanceFrontier: [dominanceFrontier](#dominancefrontier), forIteratedDominanceFrontier: [forIteratedDominanceFrontier](#foriterateddominancefrontier), forPrunedIteratedDominanceFrontier: [forPrunedIteratedDominanceFrontier](#forprunediterateddominancefrontier), iterated_dominance_frontier: iterated_dominance_frontier, iteratedDominanceFrontier: [iteratedDominanceFrontier](#iterateddominancefrontier)}** 

## alternative_idf

This calculates the iterated dominance frontier quickest of all but requires
that you have already computed the dominance frontier for each individual node.
If you call this without frontiers being set, it will calculate all of them the
first time.

**Parameters**

-   `defs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** 

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)** 

## forIteratedDominanceFrontier

Same as `iteratedDominanceFrontier( defs )` except it doesn't return anything but will
invoke the callback as it discovers each node in the iterated dominance frontier.

**Parameters**

-   `fn` **function ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)): any** A callback function with one argument, a node in the DF of the input list
-   `defs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** A list of definition nodes

## iteratedDominanceFrontier

Given a list of definition nodes, let's call them start nodes, this will return the
dominance frontier of those nodes. If you're doing SSA, this would be where you'd
want to place phi-functions when building a normal SSA tree. To create a pruned or
minimal tree, you'd probably have to discard some of these but it makes for a starting point.

**Parameters**

-   `defs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** A list of definition nodes

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** A list of all node sin the DF of the input set

## forStrictDominators

Loops through each strict dominator of the given node.

**Parameters**

-   `fn` **function ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number))** 
-   `to` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 

## forStrictDominators

* * *

DOMINATORS UP

* * *

**Parameters**

-   `fn`  
-   `to`  

## forDominators

This will visit the dominators starting with the `to` node and moving up the idom tree
until it gets to the root.

**Parameters**

-   `fn` **function ([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number))** 
-   `to` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 

## strictDominators

This will return all strict dominators for the given node. Same as `dominators` but
excluding the given node.

**Parameters**

-   `to` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** 

## dominators

This returns a list of all dominators for the given node, including the node itself since a node
always dominates itself.

**Parameters**

-   `block`  

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** 

## strictlyDominates

This will return one of two things. If call with two node numbers, it will return a `boolean` indicating
if the first node strictly dominates the second node.

If called with only one node number then it will create a list of all nodes strictly dominated by the given
node.

**Parameters**

-   `from` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `to` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** 

Returns **([boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean) \| [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>)** 

## strictlyDominates

* * *

DOMINATES DOWN

* * *

**Parameters**

-   `from`  
-   `to`  

## dominates

This is the same as the `strictlyDominates()` function but includes the given node.

**Parameters**

-   `from` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `to` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** 

Returns **([boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean) \| [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>)** 

## forStrictlyDominates

Thie loops through all nodes strictly dominated by the given node.

**Parameters**

-   `fn` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** 
-   `from` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `notStrict` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** =false] (optional, default `false`)

## forDominates

Thie loops through all nodes strictly dominated by the given node, including the node itself.

**Parameters**

-   `fn` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** 
-   `from` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 

## forDominanceFrontier

* * *

DOMINANCE FRONTIER DOWN

* * *

**Parameters**

-   `fn`  
-   `from`  

## forDominanceFrontier

Paraphrasing from [Dominator (graph theory)](https://en.wikipedia.org/wiki/Dominator_(graph_theory)):

>    "The dominance frontier of a block 'from' is the set of all blocks 'to' such that
>    'from' dominates an immediate predecessor of 'to', but 'from' does not strictly
>    dominate 'to'."

A useful corner case to remember: a block may be in its own dominance frontier if it has
a loop edge to itself, since it dominates itself and so it dominates its own immediate
predecessor, and a block never strictly dominates itself.

**Parameters**

-   `fn` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** 
-   `from` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 

## dominanceFrontier

Returns the dominanace frontier of a given node.

**Parameters**

-   `from` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** 

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** 

## forPrunedIteratedDominanceFrontier

This is a close relative of forIteratedDominanceFrontier(), which allows the
given predicate function to return false to indicate that we don't wish to consider the given block.
Useful for computing pruned SSA form.

**Parameters**

-   `fn` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** 
-   `from` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** 

## 

See README.md for details

For the sake of completeness, below is the fast balanaced version of link, which is not included in the current module code
for two reasons:

1.  The LT algorithm with this LINK only becomes faster than the normal implementation when we're dealing with
    10s or 100s of thousands of nodes, in which cases you shouldn't be using JavaScript anyway.
2.  I don't have test graph large enough to get proper coverage so, since it's not really useful,
    I decided to remove it.

This implementation uses arrays rather then an object. That's how I originally implemented this algorithm
but that makes it incompatible with the current implementation. I won't convert it since it's not used, however,
because it is interesting, I've included it here, for interested parties, of which there will probably be at least
zero but not more.

**Examples**

```javascript
balanced_link = ( w ) => {
        let s = w,
            v = parent[ w ];

        do
        {
            let cs  = child[ s ],
                bcs = cs !== null ? best[ cs ] : null;

            if ( cs !== null && semi[ best[ w ] ] < semi[ bcs ] )
            {
                let ccs  = child[ cs ],
                    ss   = size[ s ],
                    scs  = size[ cs ],
                    sccs = ccs !== null ? size[ ccs ] : 0;

                if ( ss - scs >= scs - sccs )
                    child[ s ] = ccs;
                else
                {
                    size[ cs ] = ss;
                    ancestor[ s ] = cs;
                    s = cs;
                }
            }
            else
                break;
        }
        while ( true );

        best[ s ] = best[ w ];
        if ( size[ v ] < size[ w ] )
        {
            let t = s;
            s = child[ v ];
            child[ v ] = t;
        }
        size[ v ] = size[ v ] + size[ w ];
        while ( s !== null )
        {
            ancestor[ s ] = v;
            s = child[ s ];
        }
    }
```

**Meta**

-   **since**: 1.0.0
-   **author**: Julian Jensen &lt;jjdanois@gmail.com>

## lt

**Parameters**

-   `nodes` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>>** 
-   `startIndex` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)**  (optional, default `0`)
-   `flat` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**  (optional, default `true`)

## 

Implements a near-linear time iterative dominator generator based on this
paper: (A Simple, Fast Dominance Algorithm)[https://www.cs.rice.edu/~keith/Embed/dom.pdf]
Citation:
Cooper, Keith & Harvey, Timothy & Kennedy, Ken. (2006). A Simple, Fast Dominance Algorithm. Rice University, CS Technical Report 06-33870

**Meta**

-   **author**: Julian Jensen &lt;jjdanois@gmail.com>

## iterative

Implements a near-linear time iterative dominator generator based on this
paper: (A Simple, Fast Dominance Algorithm)[https://www.cs.rice.edu/~keith/Embed/dom.pdf]
Citation:
Cooper, Keith & Harvey, Timothy & Kennedy, Ken. (2006). A Simple, Fast Dominance Algorithm. Rice University, CS Technical Report 06-33870

**Parameters**

-   `succs` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;([Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)> | [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number))>** 
-   `startIndex` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)**  (optional, default `0`)
-   `flat` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**  (optional, default `true`)

Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)>** 

## nsuccs
