diff --git a/app/dependencies.ts b/app/dependencies.ts
index c732a98..1be669b 100644
--- a/app/dependencies.ts
+++ b/app/dependencies.ts
@@ -2,7 +2,7 @@
///
///
-///
+///
// System part
diff --git a/app/helpers/VersionHelper.ts b/app/helpers/VersionHelper.ts
index 71bcbf3..87e9559 100644
--- a/app/helpers/VersionHelper.ts
+++ b/app/helpers/VersionHelper.ts
@@ -3,24 +3,24 @@
// TODO : test
class VersionHelper {
//region Fields
-
+
private static _target : string = 'http://yimello.adriencadet.com/version';
- private static _version : string = '0.3.2';
+ private static _version : string = '0.3.3';
//endregion Fields
-
+
//region Constructors
-
+
//endregion Constructors
-
+
//region Methods
-
+
//region Private Methods
-
+
//endregion Private Methods
-
+
//region Public Methods
-
+
static isUpToDate(callback : Action, errorHandler? : Action) : void {
var get : GetRequest;
@@ -47,6 +47,6 @@ class VersionHelper {
}
//endregion Public Methods
-
+
//endregion Methods
}
diff --git a/app/libs/ludivine.1.1.0.min.ts b/app/libs/ludivine.1.1.0.min.ts
deleted file mode 100755
index 5f06b55..0000000
--- a/app/libs/ludivine.1.1.0.min.ts
+++ /dev/null
@@ -1 +0,0 @@
-interface Action0 { () : void; } interface Action { (t : T) : void; } interface Action2 { (t : T, u : U) : void; } interface Action3 { (t : T, u : U, v : V) : void; } interface Action4 { (t : T, u : U, v : V, w : W) : void; }class Exception { private _error : any; constructor(msg : string, name : string = 'Exception') { this._error = new Error(msg); this._error.name = name; } getMessage() : string { return this._error.message; } getName() : string { return this._error.name; } getStackTrace() : string { return this._error.stack; } toString() : string { return this._error.name + ': ' + this._error.message; } }interface Func0 { () : U; } interface Func { (t: T) : U; } interface Func2 { (t : T, u : U) : V; } interface Func3 { (t : T, u : U, v : V) : W } interface Func4 { (t : T, u : U, v : V, w : W) : X }class Guid { static _randomString(length : number) : string { if (length < 1) { return null; } else { var charSet : string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var outcome : string = ''; for (var i = 0; i < length; i++) { var index : number; index = Math.floor(Math.random() * charSet.length); outcome += charSet.charAt(index); } return outcome; } } static newGuid() : string { var outcome : StringBuffer; outcome = new StringBuffer(); outcome.append(Guid._randomString(8)); outcome.append('-'); outcome.append(Guid._randomString(4)); outcome.append('-'); outcome.append(Guid._randomString(4)); outcome.append('-'); outcome.append(Guid._randomString(4)); outcome.append('-'); outcome.append(Guid._randomString(12)); return outcome.toString(); } }class KeyValuePair { private _key : T; private _value : U; constructor(key? : T, value? : U) { this._key = key; this._value = value; } getKey() : T { return this._key; } setKey(key : T) : void { this._key = key; } getValue() : U { return this._value; } setValue(value : U) : void { this._value = value; } }enum LogLevel { Debug = 0, Test = 1, Production = 2, Opaque = 3 } class Log { private static _currentLevel : LogLevel = LogLevel.Debug; static setLevel(level : LogLevel) : void { Log._currentLevel = level; } static debug(msg : string) : void { if (this._currentLevel <= LogLevel.Debug) { console.log('DEBUG: ' + msg); } } static inform(msg : string) : void { if (this._currentLevel <= LogLevel.Test) { console.log('%cINFORM: ' + msg, 'color: DeepSkyBlue;'); } } static warn(msg : string) : void { if (this._currentLevel <= LogLevel.Production) { console.log('%cWARN: ' + msg, 'color: orange;'); } } static error(error : Exception) : void { console.error('Error: ' + error.toString()); } }class PeriodicTimer { private _timer : any; constructor(handler : Action, period : number, argument? : T) { this._timer = setInterval( () => { handler(argument); }, period ); } stop() : void { clearInterval(this._timer); } }class StringBuffer { private _content : Array; constructor(first : string = '') { this._content = new Array(); this._content.push(first); } append(s: string) : StringBuffer { this._content.push(s); return this; } toString() : string { var result : string = ''; for (var i = 0; i < this._content.length; i++) { result += this._content[i]; } return result; } }class Timer { private _timer : any; constructor(handler : Action, delay : number, argument? : T) { this._timer = setTimeout( () => { handler(argument); }, delay ); } stop() : void { clearTimeout(this._timer); } }class ArrayList implements IList { private _content : Array; constructor(source? : ICollection) { this._content = new Array(); if (source !== null && source !== undefined) { source.forEach(x => this.add(x)); } } insertAt(index : number, value : T) : void { if (index < 0) { throw new CollectionException('Unbound index'); } if (index >= this._content.length) { this.add(value); } else { var tmp : T; tmp = this._content[index]; this._content[index] = value; this.insertAt(index + 1, tmp); } } add(value : T) : void { this._content.push(value); } getAt(index : number) : T { if (index < 0 || index >= this._content.length) { throw new CollectionException('Unbound index'); } return this._content[index]; } getLength() : number { return this._content.length; } remove(value : T) : void { var a : Array; var size : number; var done : boolean; size = this.getLength(); if (size === 0) { return; } a = new Array(); done = false; for (var i = 0; i < size; i++) { var e : T; e = this._content[i]; if (e !== value) { a.push(e); } else { if (done) { a.push(e); } else { done = true; } } } this._content = a; } removeAt(index : number) : void { var size : number; var a : Array; size = this.getLength(); if (index < 0 || index >= size) { throw new CollectionException('Unbound index'); } a = new Array(); for (var i = 0; i < size; i++) { if (i !== index) { a.push(this.getAt(i)); } } this._content = a; } removeIf(func : Func) : void { var a : Array; var size : number; size = this.getLength(); if (size === 0) { return; } a = new Array(); for (var i = 0; i < size; i++) { var e : T; e = this._content[i]; if (!func(e)) { a.push(e); } } this._content = a; } orderBy(getter : Func) : ISortableCollection { var a : Array; var outcome : ArrayList; outcome = new ArrayList(); if (this.getLength() === 0) { return outcome; } a = new Array(); this.forEach(e => a.push(e)); CollectionUtils.ArrayUtils.sort(a, getter); for (var i = 0; i < a.length; i++) { outcome.add(a[i]); } return outcome; } orderByDesc(getter : Func) : ISortableCollection { var a : Array; var outcome : ArrayList; outcome = new ArrayList(); if (this.getLength() === 0) { return outcome; } a = new Array(); this.forEach(e => a.push(e)); CollectionUtils.ArrayUtils.sort(a, getter, false); for (var i = 0; i < a.length; i++) { outcome.add(a[i]); } return outcome; } reverse() : ISortableCollection { var outcome : ArrayList; outcome = new ArrayList(); for (var i = this.getLength() - 1; i >= 0; i--) { outcome.add(this.getAt(i)); } return outcome; } find(selector : Func) : T { var size : number; size = this.getLength(); for (var i = 0; i < size; i++) { var e : T; e = this.getAt(i); if (selector(e)) { return e; } } return null; } forEach(action : Action) : void { var size : number; size = this.getLength(); for (var i = 0; i < size; i++) { action(this.getAt(i)); } } map(action : Func) : ICollection { var outcome : ArrayList; outcome = new ArrayList(); this.forEach(e => outcome.add(action(e))); return outcome; } max(getter : Func) : T { var max : number; var current : T; if (this.getLength() === 0) { return null; } current = this.getAt(0); max = getter(current); this.forEach( (e) => { var value : number; value = getter(e); if (value > max) { max = value; current = e; } } ); return current; } min(getter : Func) : T { var min : number; var current : T; if (this.getLength() === 0) { return null; } current = this.getAt(0); min = getter(current); this.forEach( (e) => { var value : number; value = getter(e); if (value < min) { min = value; current = e; } } ); return current; } select(selector : Func) : ICollection { var outcome : ArrayList; outcome = new ArrayList(); this.forEach( (e) => { if (selector(e)) { outcome.add(e); } } ); return outcome; } sum(getter : Func) : number { var acc : number; acc = 0; this.forEach(e => acc += getter(e)); return acc; } toArray() : Array { var outcome : Array; outcome = new Array(); this.forEach(x => outcome.push(x)); return outcome; } toDictionary(keyGetter : Func, valueGetter : Func) : IDictionary { var outcome : IDictionary; outcome = new Dictionary(); this.forEach(x => outcome.add(keyGetter(x), valueGetter(x))); return outcome; } toList() : IList { return new ArrayList(this); } }class Dictionary implements IDictionary { private _content : Array>; constructor(source? : ICollection>) { this._content = new Array>(); if (source !== null && source !== undefined) { source.forEach(x => this.add(x.getKey(), x.getValue())); } } add(key : K, value : V) : void { if (this.hasKey(key)) { throw new CollectionException('Unable to add value: key already exists'); } else { this._content.push(new KeyValuePair(key, value)); } } get(key : K) : V { var size : number; size = this._content.length; for (var i = 0; i < size; i++) { var pair : KeyValuePair; pair = this._content[i]; if (pair.getKey() === key) { return pair.getValue(); } } throw new CollectionException('No value found for provided key'); } getSize() : number { return this._content.length; } hasKey(key : K) : boolean { var size : number; size = this._content.length; for (var i = 0; i < size; i++) { var pair : KeyValuePair; pair = this._content[i]; if (pair.getKey() === key) { return true; } } return false; } remove(key : K) : void { var size : number; var a : Array>; a = new Array>(); size = this._content.length; for (var i = 0; i < size; i++) { var pair : KeyValuePair; pair = this._content[i]; if (pair.getKey() !== key) { a.push(pair); } } if (a.length === size) { throw new CollectionException('Unable to remove pair: key does not exist'); } this._content = a; } removeIf(func : Func, boolean>) : void { var size : number; var a : Array>; a = new Array>(); size = this._content.length; for (var i = 0; i < size; i++) { var pair : KeyValuePair; pair = this._content[i]; if (!func(pair)) { a.push(pair); } } this._content = a; } find(selector : Func, boolean>) : KeyValuePair { var size : number; size = this._content.length; for (var i = 0; i < size; i++) { var pair : KeyValuePair; pair = this._content[i]; if (selector(pair)) { return pair; } } return null; } forEach(action : Action>) : void { var size : number; size = this._content.length; for (var i = 0; i < size; i++) { action(this._content[i]); } } map(action : Func, KeyValuePair>) : ICollection> { var outcome : Dictionary; outcome = new Dictionary(); this.forEach( (pair) => { var result : KeyValuePair; result = action(pair); outcome.add(result.getKey(), result.getValue()); } ); return outcome; } max(getter : Func, number>) : KeyValuePair { var max : number; var e : KeyValuePair; if (this.getSize() === 0) { return null; } e = this._content[0]; max = getter(e); this.forEach( (x) => { var value : number; value = getter(x); if (value > max) { max = value; e = x; } } ); return e; } min(getter : Func, number>) : KeyValuePair { var min : number; var e : KeyValuePair; if (this.getSize() === 0) { return null; } e = this._content[0]; min = getter(e); this.forEach( (x) => { var value : number; value = getter(x); if (value < min) { min = value; e = x; } } ); return e; } select(selector : Func, boolean>) : ICollection> { var outcome : Dictionary; outcome = new Dictionary(); this.forEach( (pair) => { if (selector(pair)) { outcome.add(pair.getKey(), pair.getValue()); } } ); return outcome; } sum(getter : Func, number>) : number { var acc : number; acc = 0; this.forEach(x => acc += getter(x)); return acc; } toArray() : Array> { var outcome : Array>; outcome = new Array>(); this.forEach(x => outcome.push(x)); return outcome; } toDictionary( keyGetter : Func, A>, valueGetter : Func, B>) : IDictionary { var outcome : IDictionary; outcome = new Dictionary(); this.forEach(x => outcome.add(keyGetter(x), valueGetter(x))); return outcome; } toList() : IList> { return new ArrayList>(this); } }module LinkedListUtils { export class LinkedListElement { private _content : T; private _next : LinkedListElement; constructor(content? : T) { this._content = content; this._next = null; } getContent() : T { return this._content; } setContent(value : T) : void { this._content = value; } getNext() : LinkedListElement { return this._next; } setNext(value : LinkedListElement) : void { this._next = value; } hasNext() : boolean { return this._next !== null && this._next !== undefined; } } } class LinkedList implements IList { private _head : LinkedListUtils.LinkedListElement; private _tail : LinkedListUtils.LinkedListElement; private _size : number; constructor(source? : ICollection) { this._size = 0; if (source !== null && source !== undefined) { source.forEach(x => this.add(x)); } } insertAt(index : number, value : T) : void { if (index < 0) { throw new CollectionException('Unbound index'); } if (index >= this.getLength()) { this.add(value); } else { var prev : LinkedListUtils.LinkedListElement, current : LinkedListUtils.LinkedListElement; var e : LinkedListUtils.LinkedListElement; e = new LinkedListUtils.LinkedListElement(value); current = this._head; for (var i = 0; i < this.getLength(); i++) { if (i === index) { if (i === 0) { e.setNext(this._head); this._head = e; } else { prev.setNext(e); e.setNext(current); } this._size++; return; } prev = current; current = current.getNext(); } } } add(value : T) : void { var e : LinkedListUtils.LinkedListElement; e = new LinkedListUtils.LinkedListElement(value); if (this.getLength() === 0) { this._head = e; this._tail = e; } else { this._tail.setNext(e); this._tail = e; } this._size++; } getAt(index : number) : T { var e : LinkedListUtils.LinkedListElement; if (index < 0 || index >= this._size) { throw new CollectionException('Unbound index'); } e = this._head; for (var i = 0; i < this.getLength(); i++) { if (i === index) { return e.getContent(); } e = e.getNext(); } } getLength() : number { return this._size; } remove(value : T) : void { var prev : LinkedListUtils.LinkedListElement, current : LinkedListUtils.LinkedListElement; current = this._head; prev = null; for (var i = 0; i < this.getLength(); i++) { if (current.getContent() === value) { if (i === 0) { this._head = current.getNext(); } else { prev.setNext(current.getNext()); } if (i === this.getLength() - 1) { this._tail = prev; } this._size--; return; } prev = current; current = current.getNext(); } } removeAt(index : number) : void { var prev : LinkedListUtils.LinkedListElement, current : LinkedListUtils.LinkedListElement; if (index < 0 || index >= this.getLength()) { throw new CollectionException('Unbound index'); } current = this._head; prev = null; for (var i = 0; i < this.getLength(); i++) { if (i === index) { if (i === 0) { this._head = current.getNext(); } else { prev.setNext(current.getNext()); } if (i === this.getLength() - 1) { this._tail = prev; } this._size--; return; } prev = current; current = current.getNext(); } } removeIf(func : Func) : void { var prev : LinkedListUtils.LinkedListElement, current : LinkedListUtils.LinkedListElement; prev = null; current = this._head; for (var i = 0; i < this.getLength(); i++) { if (func(current.getContent())) { if (prev === null || prev === undefined) { this._head = current.getNext(); } else { prev.setNext(current.getNext()); } if (i === this.getLength() - 1) { this._tail = prev; } this._size--; } else { prev = current; } current = current.getNext(); } } orderBy(getter : Func) : ISortableCollection { var a : Array; var size : number; var outcome : LinkedList; outcome = new LinkedList(); if (this.getLength() === 0) { return outcome; } a = this.toArray(); CollectionUtils.ArrayUtils.sort(a, getter); size = a.length; for (var i = 0; i < size; i++) { outcome.add(a[i]); } return outcome; } orderByDesc(getter : Func) : ISortableCollection { var a : Array; var size : number; var outcome : LinkedList; outcome = new LinkedList(); if (this.getLength() === 0) { return outcome; } a = this.toArray(); CollectionUtils.ArrayUtils.sort(a, getter, false); size = a.length; for (var i = 0; i < size; i++) { outcome.add(a[i]); } return outcome; } reverse() : ISortableCollection { var outcome : LinkedList; var a : Array; outcome = new LinkedList(); a = this.toArray(); for (var i = a.length - 1; i >= 0; i--) { outcome.add(a[i]); } return outcome; } find(selector : Func) : T { var cursor : LinkedListUtils.LinkedListElement; var e : T; if (this.getLength() === 0) { return null; } cursor = this._head; while (cursor.hasNext()) { e = cursor.getContent(); if (selector(e)) { return e; } cursor = cursor.getNext(); } e = cursor.getContent(); if (selector(e)) { return e; } else { return null; } } forEach(action : Action) : void { var cursor : LinkedListUtils.LinkedListElement; if (this.getLength() === 0) { return; } cursor = this._head; while (cursor.hasNext()) { action(cursor.getContent()); cursor = cursor.getNext(); } action(cursor.getContent()); } map(action : Func) : ICollection { var outcome : LinkedList; outcome = new LinkedList(); this.forEach(x => outcome.add(action(x))); return outcome; } max(getter : Func) : T { var max : number; var current : T; if (this.getLength() === 0) { return null; } current = this._head.getContent(); max = getter(current); this.forEach( (e) => { var value : number; value = getter(e); if (value > max) { max = value; current = e; } } ); return current; } min(getter : Func) : T { var min : number; var current : T; if (this.getLength() === 0) { return null; } current = this._head.getContent(); min = getter(current); this.forEach( (e) => { var value : number; value = getter(e); if (value < min) { min = value; current = e; } } ); return current; } select(selector : Func) : ICollection { var outcome : LinkedList; outcome = new LinkedList(); this.forEach( (e) => { if (selector(e)) { outcome.add(e); } } ); return outcome; } sum(getter : Func) : number { var acc : number; acc = 0; this.forEach(x => acc += getter(x)); return acc; } toArray() : Array { var outcome : Array; outcome = new Array(); this.forEach(x => outcome.push(x)); return outcome; } toDictionary(keyGetter : Func, valueGetter : Func) : IDictionary { var outcome : IDictionary; outcome = new Dictionary(); this.forEach(x => outcome.add(keyGetter(x), valueGetter(x))); return outcome; } toList() : IList { return new ArrayList(this); } }module QueueUtils { export class QueueElement { private _content : T; private _next : QueueElement; constructor(content? : T) { this._content = content; this._next = null; } getContent() : T { return this._content; } setContent(value : T) : void { this._content = value; } getNext() : QueueElement { return this._next; } setNext(value : QueueElement) : void { this._next = value; } hasNext() : boolean { return (this._next !== null && this._next !== undefined); } } } class Queue implements ISortableCollection { private _top : QueueUtils.QueueElement; private _bottom : QueueUtils.QueueElement; private _size : number; constructor(source? : ICollection) { this._size = 0; if (source !== null && source !== undefined) { source.forEach(x => this.push(x)); } } getSize() : number { return this._size; } top() : T { if (this._size === 0) { return null; } else { return this._top.getContent(); } } pop() : T { if (this._size === 0) { return null; } else { var outcome : T; outcome = this._top.getContent(); if (this._size === 1) { this._top = null; this._bottom = null; } else { this._top = this._top.getNext(); } this._size--; return outcome; } } push(value : T) : void { var e : QueueUtils.QueueElement; e = new QueueUtils.QueueElement(value); if (this._size === 0) { this._top = e; this._bottom = e; } else { this._bottom.setNext(e); this._bottom = e; } this._size++; } orderBy(getter : Func) : ISortableCollection { var a : Array; var outcome : Queue; outcome = new Queue(); if (this.getSize() === 0) { return outcome; } a = new Array(); this.forEach(e => a.push(e)); CollectionUtils.ArrayUtils.sort(a, getter); for (var i = 0; i < a.length; i++) { outcome.push(a[i]); } return outcome; } orderByDesc(getter : Func) : ISortableCollection { var a : Array; var outcome : Queue; outcome = new Queue(); if (this.getSize() === 0) { return outcome; } a = new Array(); this.forEach(e => a.push(e)); CollectionUtils.ArrayUtils.sort(a, getter, false); for (var i = 0; i < a.length; i++) { outcome.push(a[i]); } return outcome; } reverse() : ISortableCollection { var outcome : Queue; var a : Array; outcome = new Queue(); if (this.getSize() === 0) { return outcome; } a = new Array(); this.forEach(x => a.push(x)); for (var i = a.length - 1; i >= 0; i--) { outcome.push(a[i]); } return outcome; } find(selector : Func) : T { var cursor : QueueUtils.QueueElement; var e : T; if (this.getSize() === 0) { return null; } cursor = this._top; while (cursor.hasNext()) { e = cursor.getContent(); if (selector(e)) { return e; } cursor = cursor.getNext(); } e = cursor.getContent(); if (selector(e)) { return e; } return null; } forEach(action : Action) : void { var cursor : QueueUtils.QueueElement; if (this.getSize() === 0) { return; } cursor = this._top; while (cursor.hasNext()) { action(cursor.getContent()); cursor = cursor.getNext(); } action(cursor.getContent()); } map(action : Func) : ICollection { var outcome : Queue; outcome = new Queue(); this.forEach( (e) => { outcome.push(action(e)); } ); return outcome; } max(getter : Func) : T { var max : number; var outcome : T; if (this.getSize() === 0) { return null; } outcome = this._top.getContent(); max = getter(outcome); this.forEach( (e) => { var value : number; value = getter(e); if (value > max) { max = value; outcome = e; } } ); return outcome; } min(getter : Func) : T { var min : number; var outcome : T; if (this.getSize() === 0) { return null; } outcome = this._top.getContent(); min = getter(outcome); this.forEach( (e) => { var value : number; value = getter(e); if (value < min) { min = value; outcome = e; } } ); return outcome; } select(selector : Func) : ICollection { var outcome : Queue; outcome = new Queue(); this.forEach( (e) => { if (selector(e)) { outcome.push(e); } } ); return outcome; } sum(getter : Func) : number { var total : number; total = 0; this.forEach(e => total += getter(e)); return total; } toArray() : Array { var outcome : Array; outcome = new Array(); this.forEach(x => outcome.push(x)); return outcome; } toDictionary(keyGetter : Func, valueGetter : Func) : IDictionary { var outcome : IDictionary; outcome = new Dictionary(); this.forEach(x => outcome.add(keyGetter(x), valueGetter(x))); return outcome; } toList() : IList { return new ArrayList(this); } }module SortedListUtils { export class SortedListElement { private _content : T; private _next : SortedListElement; constructor(content? : T) { this._content = content; this._next = null; } getContent() : T { return this._content; } setContent(value : T) : void { this._content = value; } getNext() : SortedListElement { return this._next; } setNext(value : SortedListElement) : void { this._next = value; } hasNext() : boolean { return this._next !== null && this._next !== undefined; } } export class SortedListCursor { private _previous : SortedListElement; private _current : SortedListElement; constructor(previous? : SortedListElement, current? : SortedListElement) { this._previous = previous; this._current = current; } getPrevious() : SortedListElement { return this._previous; } setPrevious(value : SortedListElement) : void { this._previous = value; } hasPrevious() : boolean { return this._previous !== null && this._previous !== undefined; } getCurrent() : SortedListElement { return this._current; } setCurrent(value : SortedListElement) : void { this._current = value; } } } class SortedList implements IListableCollection { private _head : SortedListUtils.SortedListElement; private _getter : Func; private _size : number; private _asc : boolean; constructor(getter : Func, ascending? : boolean) { this._getter = getter; this._size = 0; if (ascending !== null && ascending !== undefined) { this._asc = ascending; } else { this._asc = true; } } private _forEach(func : Func, boolean>) : boolean { var prev : SortedListUtils.SortedListElement, current : SortedListUtils.SortedListElement; if (this.getLength() === 0) { return false; } current = this._head; prev = null; while (current.hasNext()) { if (func(new SortedListUtils.SortedListCursor(prev, current))) { return true; } prev = current; current = current.getNext(); } return func(new SortedListUtils.SortedListCursor(prev, current)); } add(value : A) : void { var e : SortedListUtils.SortedListElement; e = new SortedListUtils.SortedListElement(value); if (this.getLength() === 0) { this._head = e; } else { var success : boolean; var latestCursor : SortedListUtils.SortedListCursor; var comparator : Func2; if (this._asc) { comparator = (a, b) => { return a < b; }; } else { comparator = (a, b) => { return a > b; }; } success = this._forEach( (cursor) => { var current : SortedListUtils.SortedListElement; current = cursor.getCurrent(); latestCursor = cursor; if (comparator(this._getter(value), this._getter(current.getContent()))) { if (cursor.hasPrevious()) { cursor.getPrevious().setNext(e); } else { this._head = e; } e.setNext(current); return true; } else { return false; } } ); if (!success) { latestCursor.getCurrent().setNext(e); } } this._size++; } getAt(index : number) : A { var outcome : A; var i : number; if (index < 0 || index >= this.getLength()) { throw new CollectionException('Unbound index'); } i = 0; this._forEach( (cursor) => { if (i === index) { outcome = cursor.getCurrent().getContent(); return true; } else { i++; return false; } } ); return outcome; } getLength() : number { return this._size; } remove(value : A) : void { var done : boolean; done = this._forEach( (cursor) => { if (cursor.getCurrent().getContent() === value) { if (cursor.hasPrevious()) { cursor.getPrevious().setNext(cursor.getCurrent().getNext()); } else { this._head = cursor.getCurrent().getNext(); } return true; } else { return false; } } ); if (done) { this._size--; } } removeAt(index : number) : void { var i : number; if (index < 0 || index >= this.getLength()) { throw new CollectionException('Unbound index'); } i = 0; this._forEach( (cursor) => { if (i === index) { var e : SortedListUtils.SortedListElement; e = cursor.getCurrent().getNext(); if (cursor.hasPrevious()) { cursor.getPrevious().setNext(e); } else { this._head = e; } return true; } i++; } ); this._size--; } removeIf(func : Func) : void { var prev : SortedListUtils.SortedListElement, current : SortedListUtils.SortedListElement; var size : number; size = this.getLength(); prev = null; current = this._head; for (var i = 0; i < size; i++) { if (func(current.getContent())) { if (prev !== null && prev !== undefined) { prev.setNext(current.getNext()); } else { this._head = current.getNext(); } this._size--; } else { prev = current; } current = current.getNext(); } } orderBy(getter : Func) : ISortableCollection { var outcome : SortedList; outcome = new SortedList(getter); this.forEach(e => outcome.add(e)); return outcome; } orderByDesc