graph-curry
Version:
a Map based implementation of canonical graph data algorithms
259 lines (171 loc) • 10.1 kB
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 …</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">¶</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">¶</a>
</div>
<p><strong>resetNodeBin</strong> <code>:: ( Map<edge>, node ) -> Map<edge></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>) =></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">¶</a>
</div>
<p><strong>addNodeBin</strong> <code>:: ( Map<edge>, node ) -> Map<edge></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>) =></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">¶</a>
</div>
<p><strong>neighborPairs</strong> <code>:: ( Map<edge>, node ) -> [ [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> =></span> src =>
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">¶</a>
</div>
<p><strong>addEdgeBin</strong> <code>:: ( Map<edge>, [node, node, Number] ) -> Map<edge></code>
add a node:Map<{node: Number}> 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>) =></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">¶</a>
</div>
<p><strong>removeEdgeBin</strong> <code>:: ( Map<edge>, [node, node] ) -> Map<edge></code>
removes a {node:Map<{node: Number}>} 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>) =></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">¶</a>
</div>
<p><strong>disconnectNodeBin</strong> <code>:: ( Map<edge>, node ) -> Map<edge></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>) =></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">¶</a>
</div>
<p><strong>removeNodeBin</strong> <code>:: ( Map<edge>, node ) -> Map<edge></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>) =></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">¶</a>
</div>
<p><strong>importEdgeBin</strong> <code>:: ( Map<edge>, [node, [node: Number]] ) -> Map<edge></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>) =></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">¶</a>
</div>
<p><strong>mergeEdgesBin</strong> <code>:: ( Map<edge>, Map<edge>, ) -> Map<edge></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>) =></span>
spread(asMap(alts)).reduce(importEdgeBin, edges);</pre></div></div>
</li>
</ul>
</div>
</body>
</html>