graph-curry
Version:
a Map based implementation of canonical graph data algorithms
141 lines (96 loc) • 6.76 kB
HTML
<html>
<head>
<title>operations.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="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="operations.html">
operations.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="strings.html">
strings.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>operations.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> { addMap, asMap, asSet, first, flatten, flattenBin, iterable,
removeBin, spread, } <span class="hljs-keyword">from</span> <span class="hljs-string">'fenugreek-collections'</span>;
<span class="hljs-keyword">import</span> { adj, copy, mergeEdges, neighbors,
nodes, removeEdges, removeNodes, resetNodes, spawn, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./graph'</span>;
<span class="hljs-keyword">import</span> { graphString, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./strings'</span>;
<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> reducers <span class="hljs-keyword">from</span> <span class="hljs-string">'./reducers'</span>;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> autoSpread = <span class="hljs-function"><span class="hljs-params">el</span> =></span>
el[<span class="hljs-built_in">Symbol</span>.iterator] ? (spread(el).reduce(flattenBin, []).map(autoSpread)) : el;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> superNode = <span class="hljs-function"><span class="hljs-params">src</span> =></span> nb => asSet([ src, nb ]);
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> combineNeighbors = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function"><span class="hljs-params">nb</span> =></span>
asSet(flatten(neighbors(g)(src))(neighbors(g)(nb)));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> combineAdj = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function"><span class="hljs-params">nb</span> =></span>
asMap(flatten(adj(g)(src))(adj(g)(nb)));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> superAdj = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function"><span class="hljs-params">nb</span> =></span>
[ src, nb ].reduce(removeBin, combineAdj(g)(src)(nb));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> superEdge = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function"><span class="hljs-params">nb</span> =></span>
addMap()(superNode(src)(nb))(superAdj(g)(src)(nb));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> contract = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function">(<span class="hljs-params">nb = first(neighbors(g</span>)(<span class="hljs-params">src</span>))) =></span>
nb ? mergeEdges(removeNodes(g)(src, nb))(superEdge(g)(src)(nb)) : g;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> contractBin = <span class="hljs-function">(<span class="hljs-params">g, [ src, nb ]</span>) =></span> contract(g)(src)(nb);
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> contractSrc = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src =>
reducers.neighborPairs(g)(src).reduce(contractBin, copy(g));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> contractNext = <span class="hljs-function">(<span class="hljs-params">g, n = (first(nodes(g</span>)))) =></span>
contract(copy(g))(n)();
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> contractAuto = <span class="hljs-function"><span class="hljs-params">g</span> =></span> nodes(g).reduce(contractNext, g);
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> contractMin = <span class="hljs-function">(<span class="hljs-params">g, min = <span class="hljs-number">2</span></span>) =></span>
g.size > min ? contractMin(contractNext(g), min) : copy(g);</pre></div></div>
</li>
</ul>
</div>
</body>
</html>