graph-curry
Version:
a Map based implementation of canonical graph data algorithms
140 lines (100 loc) • 7.63 kB
HTML
<html>
<head>
<title>tree.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>tree.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> { lastK, mapDiff, spread, } <span class="hljs-keyword">from</span> <span class="hljs-string">'fenugreek-collections'</span>;
<span class="hljs-keyword">import</span> { addEdges, addEntry, addNeighbor, addNodes, adj, contains, copy,
isAdjacent, mergeEdges, mergeNeighbors, neighbors, nodes, removeEdges, removeNodes, resetNodes, } <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">'./show'</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">import</span> { bfs, dfs, dijkstra, pathBetween, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./search'</span>;
<span class="hljs-keyword">import</span> { disconnectNodes, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./'</span>;
<span class="hljs-keyword">import</span> { components, componentSet, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./components'</span>;
<span class="hljs-keyword">import</span> { superNode, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./contract'</span>;
<span class="hljs-keyword">import</span> { initPath, nextPath, } <span class="hljs-keyword">from</span> <span class="hljs-string">'./path'</span>;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> countComponents = <span class="hljs-function"><span class="hljs-params">g</span> =></span> componentSet(g).size;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> selectNeighbor = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function"><span class="hljs-params">nb</span> =></span> nb ?
addEdges(disconnectNodes(g)(src))(src)(nb) : g;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> selectNeighborBin = <span class="hljs-function">(<span class="hljs-params">g, [ src, nb ]</span>) =></span> selectNeighbor(g)(src)(nb);
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> compSize = <span class="hljs-function"><span class="hljs-params">g</span> =></span> componentSet(g).size;
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> sameComps = <span class="hljs-function"><span class="hljs-params">g0</span> =></span> g1 => compSize(g0) === compSize(g1);
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> uncut = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function"><span class="hljs-params">nb</span> =></span> sameComps(g)(selectNeighbor(g)(src)(nb));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> uncutKey = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => <span class="hljs-function">(<span class="hljs-params">[ n, w ]</span>) =></span> uncut(g)(src)(n);
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> safeNabes = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => neighbors(g)(src).filter(uncut(g)(src));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> nextUncut = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => neighbors(g)(src).find(uncut(g)(src));
<span class="hljs-keyword">const</span> single = <span class="hljs-function">(<span class="hljs-params">[ el, ...rest ]</span>) =></span> [ el ];
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> safeSearch = <span class="hljs-function"><span class="hljs-params">g</span> =></span> (src) => {
<span class="hljs-keyword">const</span> trav = <span class="hljs-function">(<span class="hljs-params">path = initPath(src</span>), [ <span class="hljs-params">n</span>, <span class="hljs-params">w</span> ] = [ <span class="hljs-params">lastK</span>(<span class="hljs-params">path</span>), 0 ]) =></span>
(spread(mapDiff(g.get(n))(path)).filter(uncutKey(g)(n)))
.reduce(trav, nextPath(path, [ n, w ]));
<span class="hljs-keyword">return</span> trav(initPath(src));
};
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> safeReduce = <span class="hljs-function"><span class="hljs-params">g</span> =></span> src => selectNeighbor(g)(src)(nextUncut(g)(src));
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> safeReduceBin = <span class="hljs-function">(<span class="hljs-params">g, src</span>) =></span>
(selectNeighbor(g)(src)(nextUncut(g)(src)));</pre></div></div>
</li>
</ul>
</div>
</body>
</html>