graph-curry
Version:
a Map based implementation of canonical graph data algorithms
146 lines (98 loc) • 5.31 kB
HTML
<html>
<head>
<title>components.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>components.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, addSet, diff, spreadK, spreadV, tuple, }
<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>components</strong> <code>:: Map<edge> -> Map<component></code>
maps each node to a set of connected nodes</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> components = <span class="hljs-function">(<span class="hljs-params">edges</span>) =></span> {
<span class="hljs-keyword">const</span> trav = <span class="hljs-function">(<span class="hljs-params">comp = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>, node</span>) =></span>
diff(spreadK(edges.get(node)))(comp).reduce(trav, addSet(comp)(node));
<span class="hljs-keyword">const</span> visitMap = <span class="hljs-function">(<span class="hljs-params">mMap = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Map</span>, node</span>) =></span>
diff(trav(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>, node))(mMap).map(tuple(trav(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>, node)))
.reduce(addBinMap, mMap);
<span class="hljs-keyword">return</span> spreadK(edges).reduce(visitMap, <span class="hljs-keyword">new</span> <span class="hljs-built_in">Map</span>);
};</pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">¶</a>
</div>
<p><strong>componentSet</strong> <code>:: Map<edge> -> Set<component></code>
partitions an edgelist into sets of connected nodes</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> componentSet = <span class="hljs-function"><span class="hljs-params">edges</span> =></span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>(spreadV(components(edges)));</pre></div></div>
</li>
</ul>
</div>
</body>
</html>