UNPKG

binary-type-tree

Version:
354 lines (349 loc) 27.8 kB
<!doctype html> <html class="default no-js"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>binary-type-tree</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="assets/css/main.css"> </head> <body> <header> <div class="tsd-page-toolbar"> <div class="container"> <div class="table-wrap"> <div class="table-cell" id="tsd-search" data-index="assets/js/search.js" data-base="."> <div class="field"> <label for="tsd-search-field" class="tsd-widget search no-caption">Search</label> <input id="tsd-search-field" type="text" /> </div> <ul class="results"> <li class="state loading">Preparing search index...</li> <li class="state failure">The search index is not available</li> </ul> <a href="index.html" class="title">binary-type-tree</a> </div> <div class="table-cell" id="tsd-widgets"> <div id="tsd-filter"> <a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a> <div class="tsd-filter-group"> <div class="tsd-select" id="tsd-filter-visibility"> <span class="tsd-select-label">All</span> <ul class="tsd-select-list"> <li data-value="public">Public</li> <li data-value="protected">Public/Protected</li> <li data-value="private" class="selected">All</li> </ul> </div> <input type="checkbox" id="tsd-filter-inherited" checked /> <label class="tsd-widget" for="tsd-filter-inherited">Inherited</label> <input type="checkbox" id="tsd-filter-only-exported" /> <label class="tsd-widget" for="tsd-filter-only-exported">Only exported</label> </div> </div> <a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a> </div> </div> </div> </div> <div class="tsd-page-title"> <div class="container"> <ul class="tsd-breadcrumb"> <li> <a href="globals.html">Globals</a> </li> </ul> <h1> binary-type-tree</h1> </div> </div> </header> <div class="container container-main"> <div class="row"> <div class="col-8 col-content"> <div class="tsd-panel tsd-typography"> <p><a href="https://travis-ci.org/marcusjwhelan/binary-type-tree"><img src="https://travis-ci.org/marcusjwhelan/binary-type-tree.svg?branch=master" alt="Build Status"></a></p> <h1 id="binary-type-tree">binary-type-tree</h1> <p>A binary search tree with AVL balancing.</p> <p>I will be working to add different balancing techniques such as red black trees, scapegoat, and splay. Uses Commonjs module system. Every utility function, type, interface, and class are able to be imported from the module or as one object.</p> <h2 id="previous-important-issues">Previous Important Issues</h2> <ul> <li>Can not enter falsy keys. Version 1.0.6 fixed a small but important issue where keys could not be falsy values. All previous version have this issue. </li> </ul> <h2 id="install">Install</h2> <pre><code class="lang-bash">npm install --save binary-type-tree </code></pre> <h2 id="usage">Usage</h2> <p>The library for now uses only an AVL balanced binary tree. The basic structure is </p> <pre><code>AVLTree - AVLNode - <span class="hljs-keyword">Node</span><span class="hljs-title">&lt;T</span>&gt; </code></pre><p>The node is a generic abstract class which can be extended. AVLNode class extends this generic Node. Finally the AVLTree extends the AVLNode, which simply is a parent class that holds the entire tree of AVLNodes. AVLNode is simply an extension of the base Node class which I hope to build on for more self balancing trees. AVL is simply the first choice. </p> <h2 id="table-of-contents">Table of Contents</h2> <ul> <li><a href="#creating-an-avl-tree">Creating an AVL Tree</a></li> <li><a href="#inserting-and-deleting-into-the-avl-tree">Inserting and deleting into the AVL Tree</a></li> <li><a href="#querying-the-avl-tree">Querying the AVL Tree</a></li> <li><a href="#key-update-on-avl-tree">Key update on AVL Tree</a></li> <li><a href="#avl-tree-extra-functionality">AVL tree extra functionality</a></li> <li><a href="#tojson">toJSON</a></li> </ul> <h2 id="creating-an-avl-tree">Creating an AVL Tree</h2> <p>Before you create a tree you will want to consider how your keys and values will be structured. All values are stored as an array even when just one element. The key can be many different types but cannot be an <code>object</code>. There are three functions provided by default in <code>src/bTreeUtils.ts</code>, that compare equality and validity that can be replaced by custom functions. These are very important when it comes to <code>$gt, $lt, $ne</code> comparisons made for the <code>query</code> method. The implementation of the <code>query</code> is on the root Node<T> at <code>lib/basic-node/node.ts</code>. During the constructor you can choose to initialize your AVL tree with several starters or none.</p> <ul> <li>key - If you would like a key on the initial Node. Inserting a new key/value pair will balance.</li> <li>value - If you would like a value on the initial Node.</li> <li>unique - Set your keys to be unique or not</li> <li>compareKeys - A function to compare keys, mostly used in the comparison during <code>$gt, $lt, $gte, $lte</code>. Takes two arguments <code>{ a: this.key, b: $queryValue }</code>, the query value is of $gt/$lt/$gte/$lte. The Default takes only a <code>number|string</code>. If you supply an fn you must adhere to these rules. <code>this.key</code> is supplied by the inner workings of this library as the the tree is traversed. <ul> <li>a &lt; b - returns -1</li> <li>a &gt; b - returns 1</li> <li>a === b - returns 0</li> <li>else throws new Error();</li> </ul> </li> <li>checkKeyEquality - Checks the equality of the key and the query from $ne. Default only uses <code>===</code> as a comparison and returns that boolean. The two arguments are <code>{a: this.key, b: $queryValue }</code>, the query value is the value of $ne. The default takes only <code>number|string|Date</code>. If you supply a fn you only need to return boolean of the comparison of the two with your own logic. </li> <li>checkValueEquality - Checks the equality of the value just like the key equality, however it is only used in one spot currently in the avl.ts file. It does loop over the array. </li> </ul> <pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { AVLTree } <span class="hljs-keyword">from</span> <span class="hljs-string">"binary-type-tree"</span>; <span class="hljs-comment">// This will create a tree with unique false, key/value null and default fns</span> <span class="hljs-keyword">let</span> TestTree: AVLTree = <span class="hljs-keyword">new</span> AVLTree({}); <span class="hljs-comment">// I think this would be the best use of the tree.</span> <span class="hljs-keyword">let</span> TestUTree: AVLTree = <span class="hljs-keyword">new</span> AVLTree({unique: <span class="hljs-literal">true</span>}); </code></pre> <h2 id="inserting-and-deleting-into-the-avl-tree">Inserting and deleting into the AVL Tree</h2> <p>Inserting and deleting is very easy and re-balances after during both and returns the re-balanced tree. </p> <pre><code class="lang-typescript">TestUTree.insert(<span class="hljs-number">123</span>, [<span class="hljs-string">"abc"</span>]); <span class="hljs-comment">// this is a unique tree</span> TestUTree.insert(<span class="hljs-number">123</span>, [<span class="hljs-string">"abc"</span>]); <span class="hljs-comment">// Throws error</span> TestUTree.insert(<span class="hljs-number">456</span>, [<span class="hljs-string">"efg"</span>]); <span class="hljs-comment">// no error</span> TestUTree.delete(<span class="hljs-number">456</span>, [<span class="hljs-string">"efg"</span>]); <span class="hljs-comment">// true.</span> <span class="hljs-comment">// if there is not key that matches it will simply return the unchanged tree.</span> </code></pre> <h2 id="querying-the-avl-tree">Querying the AVL Tree</h2> <p>Query is very simple and easy to use and returns an array of the values found. There are also some other methods to query information from the tree.</p> <pre><code class="lang-typescript"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> BTT <span class="hljs-keyword">from</span> <span class="hljs-string">"binary-type-tree"</span>; <span class="hljs-comment">// BTT.ASNDBS is a type which is almost any. Used for Keys </span> <span class="hljs-comment">// Array,string,number,Date,boolean,symbol,null</span> <span class="hljs-comment">// the full type declaration is</span> <span class="hljs-comment">//</span> <span class="hljs-comment">// Array&lt;any[]|string|number|Date|boolean|symbol|null&gt;|string|number|Date|boolean|symbol|null </span> <span class="hljs-comment">//</span> <span class="hljs-comment">// BTT.SNDBSA is a type which is almost any in array for Values</span> <span class="hljs-comment">// full type</span> <span class="hljs-comment">//</span> <span class="hljs-comment">// Array&lt;{}|any[]|string|number|Date|boolean|symbol|null&gt;</span> <span class="hljs-comment">//</span> <span class="hljs-keyword">let</span> numEight: BTT.SNDBSA = avlTree.tree.search(<span class="hljs-number">8</span>); <span class="hljs-comment">//</span> <span class="hljs-keyword">let</span> avlTree: BTT.AVLTree = <span class="hljs-keyword">new</span> BTT.AVLTree({unique: <span class="hljs-literal">true</span>}); <span class="hljs-comment">// Lets avlTree tree has keys 0-100 with values 100-0</span> <span class="hljs-comment">//</span> <span class="hljs-comment">// I want all the keys greater than or equal 90</span> <span class="hljs-keyword">let</span> nintyUp: BTT.SNDBSA = avlTree.tree.query({$gte: <span class="hljs-number">90</span>}); <span class="hljs-comment">// nintyUp will have an array of values from [10..0] </span> <span class="hljs-comment">//</span> <span class="hljs-comment">// If I want to get values greater then 50 but less than 60 but not 55</span> <span class="hljs-keyword">let</span> fullQuery: BTT.SNDBSA = avlTree.tree.query({$gte: <span class="hljs-number">50</span>, $lte: <span class="hljs-number">60</span>, $ne: <span class="hljs-number">55</span>}); <span class="hljs-comment">// fullQuery = [50,51,52,53,54,56,57,58,59,60]; </span> <span class="hljs-comment">//</span> <span class="hljs-comment">// You could supply a new checkKeyEquality to check for arrays</span> <span class="hljs-comment">// so you could possibly have </span> <span class="hljs-keyword">let</span> exampleQ: BTT.SNDBSA = avlTree.tree.query({$ne: [..<span class="hljs-number">.90</span>]}); <span class="hljs-comment">//</span> <span class="hljs-comment">//</span> <span class="hljs-comment">//</span> <span class="hljs-comment">// You could also find yourself needing more information</span> <span class="hljs-keyword">let</span> max: BTT.ASNDBS = avlTree.tree.getMaxKey(); <span class="hljs-keyword">let</span> min: BTT.ASNDBS = avlTree.tree.getMinKey(); <span class="hljs-keyword">let</span> totalKeys: <span class="hljs-built_in">number</span> = avlTree.tree.getNumberOfKeys(); <span class="hljs-keyword">let</span> maxAVLNode: BTT.AVLNode = avlTree.tree.getMaxKeyDescendant(); <span class="hljs-keyword">let</span> minAVLNode: BTT.AVLNode = avlTree.tree.getMinKeyDescendant(); <span class="hljs-comment">//</span> <span class="hljs-comment">//</span> <span class="hljs-comment">// If you would like to check the AVLTree for validity</span> avlTree.tree.checkisAVLT(); <span class="hljs-comment">// throw error if pointers fail, wrong ordering. and AVL height restrictions. or if not root node.</span> </code></pre> <h2 id="key-update-on-avl-tree">Key update on AVL Tree</h2> <p>If you would like to update a key you can with this new method. With unique trees the method will throw an error if the attempt to update a key to an existing key is made. Updates do not upsert, the method will simply return a non modified tree if the key to be update is not found. For non unique trees if the values are simply moved from one node to the node matching the <code>newKey</code> argument. If the <code>newKey</code> does not match anykeys on the tree then a new one is created and the old node is removed. For unique keys this also happens when there is no match for the <code>newKey</code>. </p> <pre><code class="lang-typescript"><span class="hljs-keyword">const</span> AVL = <span class="hljs-keyword">new</span> AVLTree({}); <span class="hljs-keyword">const</span> AVLU = <span class="hljs-keyword">new</span> AVLTree({unique: <span class="hljs-literal">true</span>}); AVLU.insert(<span class="hljs-number">123</span>, [<span class="hljs-number">45</span>]); AVLU.insert(<span class="hljs-number">13</span>, [<span class="hljs-number">56</span>]); AVLU.updateKey(<span class="hljs-number">123</span>, <span class="hljs-number">133</span>); <span class="hljs-comment">// node 123 will be removed and 133 will be created</span> AVLU.updateKey(<span class="hljs-number">13</span>, <span class="hljs-number">133</span>); <span class="hljs-comment">// no change, newKey exists. Error is thrown. </span> AVL.insert(<span class="hljs-number">1</span>, [<span class="hljs-number">1</span>]); AVL.insert(<span class="hljs-number">1</span>, [<span class="hljs-number">2</span>]); <span class="hljs-comment">// node with key 1 now has value [1,2];</span> AVL.insert(<span class="hljs-number">2</span>, [<span class="hljs-number">3</span>]); AVL.updateKey(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>); <span class="hljs-comment">// node with key 2 now has value [1,2,3];</span> </code></pre> <h2 id="avl-tree-extra-functionality">AVL tree extra functionality</h2> <p>If you would like to write a custom function to execute on every AVLNode then you can use the <code>executeOnEveryNode</code> method, it takes a type of <code>any</code> but and returns. Best used by supplying a reference to a function.</p> <pre><code class="lang-typescript"><span class="hljs-keyword">const</span> keys: BTT.ASNDBS = []; <span class="hljs-keyword">let</span> executed: <span class="hljs-built_in">number</span> = <span class="hljs-number">0</span>; avlTree.tree.executeOnEveryNode(<span class="hljs-function">(<span class="hljs-params">node</span>) =&gt;</span> { keys.push(node.key); executed += <span class="hljs-number">1</span>; }); </code></pre> <p>If you would like to create a AVLNode with similar options to another tree without a key or value there is a method to do so.</p> <pre><code class="lang-typescript"><span class="hljs-keyword">const</span> similarNode: BTT.AVLNode = avlTree.tree.createSimilar({}); </code></pre> <p>There is also a method available to retrieve the node holding a key. </p> <pre><code class="lang-typescript"><span class="hljs-comment">// returns null if node is not found.</span> <span class="hljs-keyword">const</span> queryNode: BTT.AVLNode|<span class="hljs-literal">null</span> = avlTree.tree.getAVLNodeFromKey(<span class="hljs-number">123</span>); </code></pre> <h2 id="tojson">toJSON</h2> <p>toJSON has been added to convert a any tree into an array in JSON of objects holding the key and value of every node. The order of the nodes in the array are sorted in a way that a re-balance will not occur if you were to loop over the array and insert into any tree. </p> <pre><code class="lang-typescript"><span class="hljs-comment">// for now there is only one tree type so AVLTree is used for the type.</span> <span class="hljs-keyword">const</span> JSONTree = AVLTree.tree.toJSON&lt;AVLTree&gt;(); <span class="hljs-comment">// retrieve tree as JSON</span> </code></pre> <h4 id="how-it-works">How it works</h4> <p>lets say given this btree</p> <pre><code> __________ <span class="hljs-number">40</span> ___________ / \ ____ <span class="hljs-number">20</span> ____ ____ <span class="hljs-number">60</span> ___ / \ / \ <span class="hljs-number">10</span> <span class="hljs-number">30</span> <span class="hljs-number">50</span> _70 _ / \ / \ / \ / \ <span class="hljs-number">5</span> <span class="hljs-number">15</span> <span class="hljs-number">25</span> <span class="hljs-number">35</span> <span class="hljs-number">45</span> <span class="hljs-number">55</span> <span class="hljs-number">65</span> <span class="hljs-number">75</span> / \ / \ / \ / \ / \ / \ / \ / \ <span class="hljs-number">3</span> <span class="hljs-number">7</span> <span class="hljs-number">12</span> <span class="hljs-number">17</span> <span class="hljs-number">23</span> <span class="hljs-number">27</span> <span class="hljs-number">33</span> <span class="hljs-number">37</span> <span class="hljs-number">43</span> <span class="hljs-number">47</span> <span class="hljs-number">52</span> <span class="hljs-number">57</span> <span class="hljs-number">62</span> <span class="hljs-number">67</span> <span class="hljs-number">72</span> <span class="hljs-number">77</span> </code></pre><p>The master array would hold </p> <pre><code class="lang-typescript"><span class="hljs-keyword">const</span> input = [ [<span class="hljs-number">40</span>], [<span class="hljs-number">20</span>,<span class="hljs-number">60</span>], [<span class="hljs-number">10</span>,<span class="hljs-number">30</span>,<span class="hljs-number">50</span>,<span class="hljs-number">70</span>], [<span class="hljs-number">5</span>,<span class="hljs-number">15</span>,<span class="hljs-number">25</span>,<span class="hljs-number">35</span>,<span class="hljs-number">45</span>,<span class="hljs-number">55</span>,<span class="hljs-number">65</span>,<span class="hljs-number">75</span>], [<span class="hljs-number">3</span>,<span class="hljs-number">7</span>,<span class="hljs-number">12</span>,<span class="hljs-number">17</span>,<span class="hljs-number">23</span>,<span class="hljs-number">27</span>,<span class="hljs-number">33</span>,<span class="hljs-number">37</span>,<span class="hljs-number">43</span>,<span class="hljs-number">47</span>,<span class="hljs-number">52</span>,<span class="hljs-number">57</span>,<span class="hljs-number">62</span>,<span class="hljs-number">67</span>,<span class="hljs-number">72</span>,<span class="hljs-number">77</span>]]; <span class="hljs-comment">//</span> <span class="hljs-comment">// This would then be formatted into this</span> <span class="hljs-keyword">const</span> result = [ [<span class="hljs-number">40</span>], [<span class="hljs-number">60</span>,<span class="hljs-number">20</span>], [<span class="hljs-number">70</span>,<span class="hljs-number">30</span>,<span class="hljs-number">50</span>,<span class="hljs-number">10</span>], [<span class="hljs-number">75</span>,<span class="hljs-number">35</span>,<span class="hljs-number">55</span>,<span class="hljs-number">15</span>,<span class="hljs-number">65</span>,<span class="hljs-number">25</span>,<span class="hljs-number">45</span>,<span class="hljs-number">5</span>], [<span class="hljs-number">77</span>,<span class="hljs-number">37</span>,<span class="hljs-number">67</span>,<span class="hljs-number">17</span>,<span class="hljs-number">57</span>,<span class="hljs-number">27</span>,<span class="hljs-number">47</span>,<span class="hljs-number">7</span>,<span class="hljs-number">72</span>,<span class="hljs-number">33</span>,<span class="hljs-number">62</span>,<span class="hljs-number">23</span>,<span class="hljs-number">52</span>,<span class="hljs-number">12</span>,<span class="hljs-number">43</span>,<span class="hljs-number">3</span>]]; <span class="hljs-comment">//</span> <span class="hljs-comment">// This is done by breaking up each array as it comes in by their indices</span> <span class="hljs-comment">// </span> <span class="hljs-comment">// Previous: [0,1], Current: [0,1,2,3]</span> <span class="hljs-comment">// get evens/odds and sub Previous from Current, Current odds [3], Previous odds [1], Current evens [2], Prev Evens [0];</span> <span class="hljs-comment">// creates</span> <span class="hljs-keyword">const</span> row3 = [<span class="hljs-number">3</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">0</span>]; <span class="hljs-comment">// 70,30,50,10</span> <span class="hljs-comment">// Now for the next level</span> <span class="hljs-comment">//</span> <span class="hljs-comment">// Previous: [3,1,2,0], Current: [0,1,2,3,4,5,6,7]</span> <span class="hljs-comment">// same step</span> <span class="hljs-comment">// Current odds: [7,5], Previous odds: [3,1], Current evens: [6,4], Previous evens: [2,0]</span> <span class="hljs-comment">// creates</span> <span class="hljs-keyword">const</span> row4 = [<span class="hljs-number">7</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>,<span class="hljs-number">1</span>,<span class="hljs-number">6</span>,<span class="hljs-number">2</span>,<span class="hljs-number">4</span>,<span class="hljs-number">0</span>]; <span class="hljs-comment">// 75,35,55,15,65,25,45,5</span> </code></pre> <p>All of these arrays are then put together into one array to reference the master array of objects to then create a JSON array. Since this method only looks at the index of the arrays and not the contents of the keys or values no comparisons are needed.</p> </div> </div> <div class="col-4 col-menu menu-sticky-wrap menu-highlight"> <nav class="tsd-navigation primary"> <ul> <li class="globals "> <a href="globals.html"><em>Globals</em></a> </li> <li class=" tsd-kind-external-module"> <a href="modules/_avl_node_avl_.html">"avl-<wbr>node/avl"</a> </li> <li class=" tsd-kind-external-module"> <a href="modules/_avl_tree_avltree_.html">"avl-<wbr>tree/avl<wbr>Tree"</a> </li> <li class=" tsd-kind-external-module"> <a href="modules/_basic_node_node_.html">"basic-<wbr>node/node"</a> </li> <li class=" tsd-kind-external-module"> <a href="modules/_utils_btreeutils_.html">"utils/b<wbr>Tree<wbr>Utils"</a> </li> <li class=" tsd-kind-external-module"> <a href="modules/_utils_equalarray_.html">"utils/equal<wbr>Array"</a> </li> </ul> </nav> <nav class="tsd-navigation secondary menu-sticky"> <ul class="before-current"> </ul> </nav> </div> </div> </div> <footer class="with-border-bottom"> <div class="container"> <h2>Legend</h2> <div class="tsd-legend-group"> <ul class="tsd-legend"> <li class="tsd-kind-module"><span class="tsd-kind-icon">Module</span></li> <li class="tsd-kind-object-literal"><span class="tsd-kind-icon">Object literal</span></li> <li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li> <li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li> <li class="tsd-kind-function tsd-has-type-parameter"><span class="tsd-kind-icon">Function with type parameter</span></li> <li class="tsd-kind-index-signature"><span class="tsd-kind-icon">Index signature</span></li> <li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li> <li class="tsd-kind-enum-member"><span class="tsd-kind-icon">Enumeration member</span></li> <li class="tsd-kind-property tsd-parent-kind-enum"><span class="tsd-kind-icon">Property</span></li> <li class="tsd-kind-method tsd-parent-kind-enum"><span class="tsd-kind-icon">Method</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li> <li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li> <li class="tsd-kind-constructor tsd-parent-kind-interface"><span class="tsd-kind-icon">Constructor</span></li> <li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li> <li class="tsd-kind-method tsd-parent-kind-interface"><span class="tsd-kind-icon">Method</span></li> <li class="tsd-kind-index-signature tsd-parent-kind-interface"><span class="tsd-kind-icon">Index signature</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li> <li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li> <li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li> <li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li> <li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li> <li class="tsd-kind-accessor tsd-parent-kind-class"><span class="tsd-kind-icon">Accessor</span></li> <li class="tsd-kind-index-signature tsd-parent-kind-class"><span class="tsd-kind-icon">Index signature</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited constructor</span></li> <li class="tsd-kind-property tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited property</span></li> <li class="tsd-kind-method tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited method</span></li> <li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited accessor</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-property tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected property</span></li> <li class="tsd-kind-method tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected method</span></li> <li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected accessor</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-property tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private property</span></li> <li class="tsd-kind-method tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private method</span></li> <li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private accessor</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-property tsd-parent-kind-class tsd-is-static"><span class="tsd-kind-icon">Static property</span></li> <li class="tsd-kind-call-signature tsd-parent-kind-class tsd-is-static"><span class="tsd-kind-icon">Static method</span></li> </ul> </div> </div> </footer> <div class="container tsd-generator"> <p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p> </div> <div class="overlay"></div> <script src="assets/js/main.js"></script> <script>if (location.protocol == 'file:') document.write('<script src="assets/js/search.js"><' + '/script>');</script> </body> </html>