UNPKG

graph-curry

Version:

a Map based implementation of canonical graph data algorithms

140 lines (100 loc) 7.63 kB
<!DOCTYPE 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 &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>tree.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> { 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> =&gt;</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> =&gt;</span> src =&gt; <span class="hljs-function"><span class="hljs-params">nb</span> =&gt;</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>) =&gt;</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> =&gt;</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> =&gt;</span> g1 =&gt; 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> =&gt;</span> src =&gt; <span class="hljs-function"><span class="hljs-params">nb</span> =&gt;</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> =&gt;</span> src =&gt; <span class="hljs-function">(<span class="hljs-params">[ n, w ]</span>) =&gt;</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> =&gt;</span> src =&gt; 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> =&gt;</span> src =&gt; 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>) =&gt;</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> =&gt;</span> (src) =&gt; { <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 ]) =&gt;</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> =&gt;</span> src =&gt; 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>) =&gt;</span> (selectNeighbor(g)(src)(nextUncut(g)(src)));</pre></div></div> </li> </ul> </div> </body> </html>