UNPKG

graph-curry

Version:

a Map based implementation of canonical graph data algorithms

259 lines (171 loc) 10.1 kB
<!DOCTYPE html> <html> <head> <title>reducers.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul id="jump_to"> <li> <a class="large" href="javascript:void(0);">Jump To &hellip;</a> <a class="small" href="javascript:void(0);">+</a> <div id="jump_wrapper"> <div id="jump_page_wrapper"> <div id="jump_page"> <a class="source" href="components.html"> components.js </a> <a class="source" href="contract.html"> contract.js </a> <a class="source" href="cut.html"> cut.js </a> <a class="source" href="graph.html"> graph.js </a> <a class="source" href="index.html"> index.js </a> <a class="source" href="path.html"> path.js </a> <a class="source" href="reducers.html"> reducers.js </a> <a class="source" href="search.html"> search.js </a> <a class="source" href="show.html"> show.js </a> <a class="source" href="tree.html"> tree.js </a> </div> </div> </li> </ul> <ul class="sections"> <li id="title"> <div class="annotation"> <h1>reducers.js</h1> </div> </li> <li id="section-1"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-1">&#182;</a> </div> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">import</span> { addBinMap, addMap, append, asMap, flatTuple, get, mapDiff, removeMap, spread, spreadK, } <span class="hljs-keyword">from</span> <span class="hljs-string">'fenugreek-collections'</span>;</pre></div></div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p><strong>resetNodeBin</strong> <code>:: ( Map&lt;edge&gt;, node ) -&gt; Map&lt;edge&gt;</code> resets the nodes adjacency list to an empty map</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> resetNodeBin = <span class="hljs-function">(<span class="hljs-params">edges, src</span>) =&gt;</span> addMap(edges)(src)(asMap());</pre></div></div> </li> <li id="section-3"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p><strong>addNodeBin</strong> <code>:: ( Map&lt;edge&gt;, node ) -&gt; Map&lt;edge&gt;</code> adds a node:adjacency list pair to an edgelist</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> addNodeBin = <span class="hljs-function">(<span class="hljs-params">edges, src</span>) =&gt;</span> addMap(edges)(src)(asMap(get(edges)(src)));</pre></div></div> </li> <li id="section-4"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p><strong>neighborPairs</strong> <code>:: ( Map&lt;edge&gt;, node ) -&gt; [ [node, node] ]</code> returns an array of [node, neigbor] pairs from an edgelist</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> neighborPairs = <span class="hljs-function"><span class="hljs-params">edges</span> =&gt;</span> src =&gt; spreadK(get(edges)(src)).map(append(src));</pre></div></div> </li> <li id="section-5"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p><strong>addEdgeBin</strong> <code>:: ( Map&lt;edge&gt;, [node, node, Number] ) -&gt; Map&lt;edge&gt;</code> add a node:Map&lt;{node: Number}&gt; entry to an edgelist</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> addEdgeBin = <span class="hljs-function">(<span class="hljs-params">edges, [ src, nb, wt = <span class="hljs-number">0</span> ]</span>) =&gt;</span> [ [ src, addMap(get(edges)(src))(nb)(wt) ], [ nb, addMap(get(edges)(nb))(src)(wt) ],].reduce(addBinMap, asMap(edges));</pre></div></div> </li> <li id="section-6"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-6">&#182;</a> </div> <p><strong>removeEdgeBin</strong> <code>:: ( Map&lt;edge&gt;, [node, node] ) -&gt; Map&lt;edge&gt;</code> removes a {node:Map&lt;{node: Number}&gt;} entry from an edgelist</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> removeEdgeBin = <span class="hljs-function">(<span class="hljs-params">edges, [ src, nb, ]</span>) =&gt;</span> [ [ src, removeMap(get(edges)(src))(nb) ], [ nb, removeMap(get(edges)(nb))(src) ]].reduce(addBinMap, asMap(edges));</pre></div></div> </li> <li id="section-7"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p><strong>disconnectNodeBin</strong> <code>:: ( Map&lt;edge&gt;, node ) -&gt; Map&lt;edge&gt;</code> removes all edges connected to a node</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> disconnectNodeBin = <span class="hljs-function">(<span class="hljs-params">edges, src</span>) =&gt;</span> neighborPairs(edges)(src).reduce(removeEdgeBin, asMap(edges));</pre></div></div> </li> <li id="section-8"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-8">&#182;</a> </div> <p><strong>removeNodeBin</strong> <code>:: ( Map&lt;edge&gt;, node ) -&gt; Map&lt;edge&gt;</code> isolates a node and removes it from edgelist</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> removeNodeBin = <span class="hljs-function">(<span class="hljs-params">edges, src</span>) =&gt;</span> removeMap(disconnectNodeBin(edges, src))(src);</pre></div></div> </li> <li id="section-9"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-9">&#182;</a> </div> <p><strong>importEdgeBin</strong> <code>:: ( Map&lt;edge&gt;, [node, [node: Number]] ) -&gt; Map&lt;edge&gt;</code> appends a node and all of its neighbors to an edgelist</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> importEdgeBin = <span class="hljs-function">(<span class="hljs-params">edges, [ src, nbs ]</span>) =&gt;</span> spread(mapDiff(nbs)(get(edges)(src))).map(flatTuple(src)) .reduce(addEdgeBin, addNodeBin(edges, src));</pre></div></div> </li> <li id="section-10"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-10">&#182;</a> </div> <p><strong>mergeEdgesBin</strong> <code>:: ( Map&lt;edge&gt;, Map&lt;edge&gt;, ) -&gt; Map&lt;edge&gt;</code> combines two Edge maps</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> mergeEdgesBin = <span class="hljs-function">(<span class="hljs-params">edges, alts</span>) =&gt;</span> spread(asMap(alts)).reduce(importEdgeBin, edges);</pre></div></div> </li> </ul> </div> </body> </html>