Skip to content

Commit 74ebd36

Browse files
First version with the most basic operations and getters
0 parents  commit 74ebd36

File tree

9 files changed

+1138
-0
lines changed

9 files changed

+1138
-0
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/node_modules
2+
/jsdoc
3+
/coverage
4+
/.idea
5+
/symbol-tree.iml
6+
/npm-debug.log

.jscsrc

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"esnext": true,
3+
"requireSemicolons": true,
4+
"validateLineBreaks": "LF",
5+
"validateIndentation": 8,
6+
"validateQuoteMarks": "'",
7+
"maximumLineLength": {
8+
"value": 120
9+
},
10+
"validateParameterSeparator": ", ",
11+
"disallowMultipleVarDecl": true,
12+
"disallowTrailingComma": true,
13+
"disallowTrailingWhitespace": true,
14+
"disallowYodaConditions": true,
15+
"disallowSpacesInFunctionDeclaration": {
16+
"beforeOpeningRoundBrace": true
17+
},
18+
"disallowSpacesInFunctionExpression": {
19+
"beforeOpeningRoundBrace": true
20+
},
21+
"disallowNewlineBeforeBlockStatements": true,
22+
"requireAlignedObjectValues": "all",
23+
"requireBlocksOnNewline": true,
24+
"requireCamelCaseOrUpperCaseIdentifiers": true,
25+
"requireCapitalizedConstructors": true,
26+
"requireCommaBeforeLineBreak": true,
27+
"requireCurlyBraces": [
28+
"if",
29+
"else",
30+
"for",
31+
"while",
32+
"do",
33+
"try",
34+
"catch"
35+
],
36+
"requireDotNotation": "except_snake_case",
37+
"requireKeywordsOnNewLine": ["else", "catch"],
38+
"requireLineBreakAfterVariableAssignment": true,
39+
"requireLineFeedAtFileEnd": true,
40+
"requirePaddingNewLinesAfterUseStrict": true,
41+
"requirePaddingNewLinesBeforeExport": true,
42+
"requirePaddingNewlinesBeforeKeywords": [
43+
"do",
44+
"for",
45+
"if",
46+
"switch",
47+
"case",
48+
"try",
49+
"while",
50+
"return",
51+
"function"
52+
]
53+
54+
55+
}

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
The MIT License (MIT)
2+
3+
Copyright (c) 2015 Joris van der Wel
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in
13+
all copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
THE SOFTWARE.

README.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
symbol-tree
2+
===========
3+
Turn any collection of objects into its own efficient tree or linked list using `Symbol`.
4+
5+
This library has been designed to provide an efficient backing data structure for DOM trees. You can also use this library as an efficient linked list. Any meta data is stored on your objects directly, which ensures any kind of insertion or deletion is performed in constant time. Because an ES6 `Symbol` is used, the meta data does not interfere with your object in any way.
6+
7+
Only io.js is supported at the moment, however io.js and node.js will merge in the near future.
8+
9+
Example
10+
-------
11+
A linked list:
12+
13+
```javascript
14+
const SymbolTree = require('symbol-tree');
15+
const tree = new SymbolTree();
16+
17+
let a = {foo: 'bar'}; // or `new Whatever()`
18+
let b = {foo: 'baz'};
19+
let c = {foo: 'qux'};
20+
21+
tree.insertBefore(a, b); // insert a before b
22+
tree.insertAfter(c, b); // insert c after b
23+
24+
console.log(tree.next(a) === b);
25+
console.log(tree.next(b) === c);
26+
console.log(tree.prev(c) === b);
27+
28+
tree.remove(b);
29+
console.log(tree.next(a) === c);
30+
```
31+
32+
A tree:
33+
34+
```javascript
35+
const SymbolTree = require('symbol-tree');
36+
const tree = new SymbolTree();
37+
38+
let parent = {};
39+
let a = {};
40+
let b = {};
41+
let c = {};
42+
43+
tree.insertFirst(a, parent); // insert a as the first child
44+
tree.insertLast(c, parent); // insert c as the last child
45+
tree.insertAfter(b, a); // insert b after a, it now has the same parent as a
46+
47+
console.log(tree.first(parent) === a);
48+
console.log(tree.next(tree.first(parent)) === b);
49+
console.log(tree.last(parent) === c);
50+
51+
let grandparent = {};
52+
tree.insertFirst(parent, grandparent);
53+
console.log(tree.first(tree.first(grandparent)) === a);
54+
```
55+
56+
See [api.md](api.md) for more documentation.
57+
58+
Testing
59+
-------
60+
Make sure you install the dependencies first:
61+
62+
npm install
63+
64+
You can now run the unit tests by executing:
65+
66+
npm test
67+
68+
The line and branch coverage should be 100%.

api.md

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
<a name="module_symbol-tree"></a>
2+
## symbol-tree
3+
**Author:** Joris van der Wel <joris@jorisvanderwel.com>
4+
5+
* [symbol-tree](#module_symbol-tree)
6+
* [SymbolTree](#exp_module_symbol-tree--SymbolTree)
7+
* [new SymbolTree([description])](#new_module_symbol-tree--SymbolTree_new)
8+
* [.initialize(object)](#module_symbol-tree--SymbolTree+initialize) ⇒ <code>Object</code>
9+
* [.isEmpty(object)](#module_symbol-tree--SymbolTree+isEmpty) ⇒ <code>Boolean</code>
10+
* [.first(object)](#module_symbol-tree--SymbolTree+first) ⇒ <code>Object</code>
11+
* [.last(object)](#module_symbol-tree--SymbolTree+last) ⇒ <code>Object</code>
12+
* [.prev(object)](#module_symbol-tree--SymbolTree+prev) ⇒ <code>Object</code>
13+
* [.next(object)](#module_symbol-tree--SymbolTree+next) ⇒ <code>Object</code>
14+
* [.parent(object)](#module_symbol-tree--SymbolTree+parent) ⇒ <code>Object</code>
15+
* [.remove(removeObject)](#module_symbol-tree--SymbolTree+remove) ⇒ <code>Object</code>
16+
* [.insertBefore(newObject, referenceObject)](#module_symbol-tree--SymbolTree+insertBefore) ⇒ <code>Object</code>
17+
* [.insertAfter(newObject, referenceObject)](#module_symbol-tree--SymbolTree+insertAfter) ⇒ <code>Object</code>
18+
* [.insertFirst(newObject, referenceObject)](#module_symbol-tree--SymbolTree+insertFirst) ⇒ <code>Object</code>
19+
* [.insertLast(newObject, referenceObject)](#module_symbol-tree--SymbolTree+insertLast) ⇒ <code>Object</code>
20+
21+
<a name="exp_module_symbol-tree--SymbolTree"></a>
22+
### SymbolTree ⏏
23+
**Kind**: Exported class
24+
<a name="new_module_symbol-tree--SymbolTree_new"></a>
25+
#### new SymbolTree([description])
26+
27+
| Param | Default | Description |
28+
| --- | --- | --- |
29+
| [description] | <code>&#x27;SymbolTree data&#x27;</code> | Description used for the Symbol |
30+
31+
<a name="module_symbol-tree--SymbolTree+initialize"></a>
32+
#### symbolTree.initialize(object) ⇒ <code>Object</code>
33+
You can optionally initialize an object after its creation,
34+
to take advantage of fast properties
35+
36+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
37+
**Returns**: <code>Object</code> - object
38+
39+
| Param | Type |
40+
| --- | --- |
41+
| object | <code>Object</code> |
42+
43+
<a name="module_symbol-tree--SymbolTree+isEmpty"></a>
44+
#### symbolTree.isEmpty(object) ⇒ <code>Boolean</code>
45+
Returns true if the object has any children.
46+
`O(1)`
47+
48+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
49+
50+
| Param | Type |
51+
| --- | --- |
52+
| object | <code>Object</code> |
53+
54+
<a name="module_symbol-tree--SymbolTree+first"></a>
55+
#### symbolTree.first(object) ⇒ <code>Object</code>
56+
Return the first child of the given object.
57+
`O(1)`
58+
59+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
60+
61+
| Param | Type |
62+
| --- | --- |
63+
| object | <code>Object</code> |
64+
65+
<a name="module_symbol-tree--SymbolTree+last"></a>
66+
#### symbolTree.last(object) ⇒ <code>Object</code>
67+
Return the last child of the given object.
68+
`O(1)`
69+
70+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
71+
72+
| Param | Type |
73+
| --- | --- |
74+
| object | <code>Object</code> |
75+
76+
<a name="module_symbol-tree--SymbolTree+prev"></a>
77+
#### symbolTree.prev(object) ⇒ <code>Object</code>
78+
Return the previous sibling of the given object.
79+
`O(1)`
80+
81+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
82+
83+
| Param | Type |
84+
| --- | --- |
85+
| object | <code>Object</code> |
86+
87+
<a name="module_symbol-tree--SymbolTree+next"></a>
88+
#### symbolTree.next(object) ⇒ <code>Object</code>
89+
Return the next sibling of the given object.
90+
`O(1)`
91+
92+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
93+
94+
| Param | Type |
95+
| --- | --- |
96+
| object | <code>Object</code> |
97+
98+
<a name="module_symbol-tree--SymbolTree+parent"></a>
99+
#### symbolTree.parent(object) ⇒ <code>Object</code>
100+
Return the parent of the given object.
101+
`O(1)`
102+
103+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
104+
105+
| Param | Type |
106+
| --- | --- |
107+
| object | <code>Object</code> |
108+
109+
<a name="module_symbol-tree--SymbolTree+remove"></a>
110+
#### symbolTree.remove(removeObject) ⇒ <code>Object</code>
111+
Remove the object from this tree.
112+
`O(1)`
113+
Has no effect if already removed.
114+
115+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
116+
**Returns**: <code>Object</code> - removeObject
117+
118+
| Param | Type |
119+
| --- | --- |
120+
| removeObject | <code>Object</code> |
121+
122+
<a name="module_symbol-tree--SymbolTree+insertBefore"></a>
123+
#### symbolTree.insertBefore(newObject, referenceObject) ⇒ <code>Object</code>
124+
Insert the given object before the reference object.
125+
`O(1)`
126+
`newObject` is now the previous sibling of `referenceObject`
127+
128+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
129+
**Returns**: <code>Object</code> - newObject
130+
**Throws**:
131+
132+
- <code>Error</code> If the newObject is already present in this SymbolTree
133+
134+
135+
| Param | Type |
136+
| --- | --- |
137+
| newObject | <code>Object</code> |
138+
| referenceObject | <code>Object</code> |
139+
140+
<a name="module_symbol-tree--SymbolTree+insertAfter"></a>
141+
#### symbolTree.insertAfter(newObject, referenceObject) ⇒ <code>Object</code>
142+
Insert the given object after the reference object.
143+
`O(1)`
144+
`newObject` is now the next sibling of `referenceObject`
145+
146+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
147+
**Returns**: <code>Object</code> - newObject
148+
**Throws**:
149+
150+
- <code>Error</code> If the newObject is already present in this SymbolTree
151+
152+
153+
| Param | Type |
154+
| --- | --- |
155+
| newObject | <code>Object</code> |
156+
| referenceObject | <code>Object</code> |
157+
158+
<a name="module_symbol-tree--SymbolTree+insertFirst"></a>
159+
#### symbolTree.insertFirst(newObject, referenceObject) ⇒ <code>Object</code>
160+
Insert the given object as the first child of the given reference object.
161+
`O(1)`
162+
`newObject` is now the first child of `referenceObject`
163+
164+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
165+
**Returns**: <code>Object</code> - newObject
166+
**Throws**:
167+
168+
- <code>Error</code> If the newObject is already present in this SymbolTree
169+
170+
171+
| Param | Type |
172+
| --- | --- |
173+
| newObject | <code>Object</code> |
174+
| referenceObject | <code>Object</code> |
175+
176+
<a name="module_symbol-tree--SymbolTree+insertLast"></a>
177+
#### symbolTree.insertLast(newObject, referenceObject) ⇒ <code>Object</code>
178+
Insert the given object as the last child of the given reference object.
179+
`O(1)`
180+
`newObject` is now the last child of `referenceObject`
181+
182+
**Kind**: instance method of <code>[SymbolTree](#exp_module_symbol-tree--SymbolTree)</code>
183+
**Returns**: <code>Object</code> - newObject
184+
**Throws**:
185+
186+
- <code>Error</code> If the newObject is already present in this SymbolTree
187+
188+
189+
| Param | Type |
190+
| --- | --- |
191+
| newObject | <code>Object</code> |
192+
| referenceObject | <code>Object</code> |
193+

0 commit comments

Comments
 (0)