From 4f1786355cc5480b184e06d5da3f6da0c257b39c Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Fri, 25 Oct 2013 13:55:57 +0400 Subject: [PATCH 01/12] Added type definitions for IxJS (only for l2o.js) Added type definitions for IxJS project v1.0.6 (https://github.com/Reactive-Extensions/IxJS) only for core Linq to Objects (l2o.js). --- ix.js/l2o.d.ts | 241 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 ix.js/l2o.d.ts diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts new file mode 100644 index 000000000..be5f43c2f --- /dev/null +++ b/ix.js/l2o.d.ts @@ -0,0 +1,241 @@ +// Type definitions for IxJS 1.0.6 +// Project: https://github.com/Reactive-Extensions/IxJS +// Definitions by: Igor Oleinikov + +declare module Ix { + export interface Enumerator { + moveNext(): boolean; + getCurrent(): T; + dispose(); + } + + export interface EnumeratorStatic { + new(moveNext: () => boolean, getCurrent: () => T, dispose: () => void): Enumerator; + create(moveNext: () => boolean, getCurrent: () => T, dispose?: () => void): Enumerator; + } + + var Enumerator: EnumerableStatic; + + export interface EnumerableFunc { + (item: T, index: number, self: Enumerable): TResult; + } + export interface EnumerablePredicate extends EnumerableFunc { } + export interface Predicate { + (item: T): boolean; + } + export interface EqualityComparer { + (item1: T1, item2: T2): boolean; + } + + export interface Enumerable { + // base functions + getEnumerator(): Enumerator; + + // "extension" functions + + aggregate(seed: TAccumulate, func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate, resultSelector: (accumulate: TAccumulate) => TResult): TResult; + aggregate(seed: TAccumulate, func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate): TAccumulate; + aggregate(func: (accumulate: T, current: T, index: number, self: Enumerable) => T): T; + + reduce(func: (accumulate: T, current: T, index: number, self: Enumerable) => T): T; + reduce(func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate, seed: TAccumulate): TAccumulate; + + all(predicate: EnumerablePredicate, thisArg?: any): boolean; + every(predicate: EnumerablePredicate, thisArg?: any): boolean; // alias + + any(predicate?: EnumerablePredicate, thisArg?: any): boolean; + some(predicate?: EnumerablePredicate, thisArg?: any): boolean; // alias + + average(selector?: EnumerableFunc): number; + max(selector?: EnumerableFunc): number; + min(selector?: EnumerableFunc): number; + sum(selector?: EnumerableFunc): number; + + concat(...sources: Enumerable[]): Enumerable; + + contains(value: TValue, comparer: EqualityComparer): boolean; + contains(value: any): boolean; + + count(predicate?: EnumerablePredicate, thisArg?: any): number; + + defaultIfEmpty(defaultValue: T): Enumerable; + + distinct(comparer?: EqualityComparer): Enumerable; + + elementAt(index: number): T; + elementAtOrDefault(index: number): T; + + except(second: Enumerable, comparer?: EqualityComparer): Enumerable; + + first(predicate?: Predicate): T; + firstOrDefault(predicate?: Predicate): T; + last(predicate?: Predicate): T; + lastOrDefault(predicate?: Predicate): T; + single(predicate?: Predicate): T; + singleOrDefault(predicate?: Predicate): T; + + forEach(action: EnumerableFunc, thisArg?: any): void; + + groupBy( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TElement, + resultSelector: (key: TKey, values: Enumerable) => TResult, + comparer?: EqualityComparer): Enumerable; + groupBy( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TElement): Grouping; + groupBy( + keySelector: (item: T) => TKey): Grouping; + + // if need to set comparer without resultSelector + groupBy( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TElement, + _: boolean, + comparer: EqualityComparer): Grouping; + // if need to set resultSelector without elementSelector + groupBy( + keySelector: (item: T) => TKey, + _: boolean, + resultSelector: (key: TKey, values: Enumerable) => TResult, + comparer?: EqualityComparer): Enumerable; + // if need to set comparer without elementSelector and resultSelector + groupBy( + keySelector: (item: T) => TKey, + _: boolean, + __: boolean, + comparer: EqualityComparer): Grouping; + + groupJoin( + inner: Enumerable, + outerKeySelector: (item: T) => TOuterKey, + innerKeySelector: (item: TInner) => TInnerKey, + resultSelector: (outer: T, innerSequence: Enumerable) => TResult, + comparer: EqualityComparer): Enumerable; + groupJoin( + inner: Enumerable, + outerKeySelector: (item: T) => TKey, + innerKeySelector: (item: TInner) => TKey, + resultSelector: (outer: T, innerSequence: Enumerable) => TResult): Enumerable; + + join( + inner: Enumerable, + outerKeySelector: (item: T) => TOuterKey, + innerKeySelector: (item: TInner) => TInnerKey, + resultSelector: (outer: T, inner: TInner) => TResult, + comparer: EqualityComparer): Enumerable; + join( + inner: Enumerable, + outerKeySelector: (item: T) => TKey, + innerKeySelector: (item: TInner) => TKey, + resultSelector: (outer: T, inner: TInner) => TResult): Enumerable; + + intersect(second: Enumerable, comparer: EqualityComparer): Enumerable; + intersect(second: Enumerable): Enumerable; + union(second: Enumerable, comparer?: EqualityComparer): Enumerable; + + orderBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + orderByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + + reverse(): Enumerable; + + select(selector: EnumerableFunc, thisArg?: any): Enumerable; + map(selector: EnumerableFunc, thisArg?: any): Enumerable; + + selectMany(collectionSelector: (item: T, index: number) => Enumerable, + resultSelector: (outer: T, inner: TCollection) => TResult): Enumerable; + selectMany(collectionSelector: (item: T, index: number) => Enumerable): Enumerable; + + sequenceEqual(second: Enumerable, comparer: EqualityComparer): boolean; + sequenceEqual(second: Enumerable): boolean; + + skip(count: number): Enumerable; + skipWhile(selector: EnumerablePredicate, thisArg?: any): Enumerable; + take(count: number): Enumerable; + takeWhile(selector: EnumerablePredicate, thisArg?: any): Enumerable; + + toArray(): T[]; + + toDictionary( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TValue, + comparer?: EqualityComparer): Dictionary; + toDictionary( + keySelector: (item: T) => TKey): Dictionary; + // if need to set comparer without elementSelector + toDictionary( + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Dictionary; + + toLookup( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TValue, + comparer?: EqualityComparer): Lookup; + toLookup( + keySelector: (item: T) => TKey): Lookup; + // if need to set comparer without elementSelector + toLookup( + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Lookup; + + where(selector: EnumerablePredicate, thisArg?: any): Enumerable; + filter(selector: EnumerablePredicate, thisArg?: any): Enumerable; + + zip(right: Enumerable, selector: (left: T, right: TRight) => TResult): Enumerable; + } + + export interface Grouping extends Enumerable { + key: TKey; + } + + export interface OrderedEnumerable extends Enumerable { + thenBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + thenByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + } + + class Dictionary { + constructor(capacity, comparer?: EqualityComparer); + + toEnumerable(): Enumerable>; + add(key: TKey, value: TValue): void; + remove(key: TKey): boolean; + clear(): void; + length(): number; + tryGetValue(key: TKey): TValue; + get(key: TKey): TValue; + set(key: TKey, value: TValue): void; + getValues(): TValue[]; + has(key: TKey): boolean; + } + + export interface KeyValuePair { + key: TKey; + value: TValue; + } + + export interface Lookup { + toEnumerable(): Enumerable>; + has(key: TKey): boolean; + length(): number; + get(key: TKey): Enumerable; + } + + export interface EnumerableStatic { + new (getEnumerator: () => Enumerator): Enumerable; + create(getEnumerator: () => Enumerator): Enumerable; + + concat(...sources: Enumerable[]): Enumerable; + empty(): Enumerable; + fromArray(array: T[]): Enumerable; + returnValue(value: T): Enumerable; + range(start: number, count: number): Enumerable; + repeat(value: T, repeatCount?: number): Enumerable; + + sequenceEqual(first: Enumerable, second: Enumerable, comparer: EqualityComparer): boolean; + sequenceEqual(first: Enumerable, second: Enumerable): boolean; + } + + var Enumerable: EnumerableStatic; +} \ No newline at end of file From 32adbb82c900b7bf8ffae22d32c16ecddb38e99c Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Fri, 25 Oct 2013 16:50:17 +0400 Subject: [PATCH 02/12] Created Disposable (for ix.js); Removed generative type recursion Via TS spec #3.5.2 generative recursive are disallowed (restriction will be removed in the future), so added workaround. Disposable interface extracted from Enumerator --- ix.js/l2o.d.ts | 59 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts index be5f43c2f..8177376e1 100644 --- a/ix.js/l2o.d.ts +++ b/ix.js/l2o.d.ts @@ -3,10 +3,13 @@ // Definitions by: Igor Oleinikov declare module Ix { - export interface Enumerator { + export interface Disposable { + dispose(); + } + + export interface Enumerator extends Disposable { moveNext(): boolean; getCurrent(): T; - dispose(); } export interface EnumeratorStatic { @@ -84,8 +87,11 @@ declare module Ix { groupBy( keySelector: (item: T) => TKey, elementSelector: (item: T) => TElement): Grouping; - groupBy( - keySelector: (item: T) => TKey): Grouping; + // spec 3.5.2, waiting for restriction on generative recursion removal + /*groupBy( + keySelector: (item: T) => TKey): Grouping;*/ + groupBy( + keySelector: (item: T) => TKey): Grouping; // if need to set comparer without resultSelector groupBy( @@ -100,11 +106,17 @@ declare module Ix { resultSelector: (key: TKey, values: Enumerable) => TResult, comparer?: EqualityComparer): Enumerable; // if need to set comparer without elementSelector and resultSelector - groupBy( + // spec 3.5.2, waiting for restriction on generative recursion removal + /*groupBy( keySelector: (item: T) => TKey, _: boolean, __: boolean, - comparer: EqualityComparer): Grouping; + comparer: EqualityComparer): Grouping;*/ + groupBy( + keySelector: (item: T) => TKey, + _: boolean, + __: boolean, + comparer: EqualityComparer): Grouping; groupJoin( inner: Enumerable, @@ -160,25 +172,41 @@ declare module Ix { keySelector: (item: T) => TKey, elementSelector: (item: T) => TValue, comparer?: EqualityComparer): Dictionary; - toDictionary( - keySelector: (item: T) => TKey): Dictionary; + // spec 3.5.2, waiting for restriction on generative recursion removal + /*toDictionary( + keySelector: (item: T) => TKey): Dictionary;*/ + toDictionary( + keySelector: (item: T) => TKey): Dictionary; // if need to set comparer without elementSelector - toDictionary( + // spec 3.5.2, waiting for restriction on generative recursion removal + /*toDictionary( keySelector: (item: T) => TKey, _: boolean, - comparer: EqualityComparer): Dictionary; + comparer: EqualityComparer): Dictionary;*/ + toDictionary( + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Dictionary; toLookup( keySelector: (item: T) => TKey, elementSelector: (item: T) => TValue, comparer?: EqualityComparer): Lookup; - toLookup( - keySelector: (item: T) => TKey): Lookup; + // spec 3.5.2, waiting for restriction on generative recursion removal + /*toLookup( + keySelector: (item: T) => TKey): Lookup;*/ + toLookup( + keySelector: (item: T) => TKey): Lookup; // if need to set comparer without elementSelector - toLookup( + // spec 3.5.2, waiting for restriction on generative recursion removal + /*toLookup( keySelector: (item: T) => TKey, _: boolean, - comparer: EqualityComparer): Lookup; + comparer: EqualityComparer): Lookup;*/ + toLookup( + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Lookup; where(selector: EnumerablePredicate, thisArg?: any): Enumerable; filter(selector: EnumerablePredicate, thisArg?: any): Enumerable; @@ -199,6 +227,7 @@ declare module Ix { constructor(capacity, comparer?: EqualityComparer); toEnumerable(): Enumerable>; + add(key: TKey, value: TValue): void; remove(key: TKey): boolean; clear(): void; @@ -216,7 +245,7 @@ declare module Ix { } export interface Lookup { - toEnumerable(): Enumerable>; + toEnumerable(): Enumerable>; has(key: TKey): boolean; length(): number; get(key: TKey): Enumerable; From dd5b76560ba4356a5ad8ddc1c84d568054cfe26a Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Fri, 25 Oct 2013 17:13:23 +0400 Subject: [PATCH 03/12] Added type definitions for IxJs/ix.js. --- ix.js/ix.d.ts | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 ix.js/ix.d.ts diff --git a/ix.js/ix.d.ts b/ix.js/ix.d.ts new file mode 100644 index 000000000..5de2361dd --- /dev/null +++ b/ix.js/ix.d.ts @@ -0,0 +1,114 @@ +/// + +declare module Ix { + + export interface Comparer { + (item1: T1, item2: T2): number; + } + + export interface Observer { + onNext? (value: T): void; + onError? (error: Error): void; + onCompleted? (): void; + } + + export interface Enumerable { + isEmpty(): boolean; + + minBy(keySelector: (item: T) => TKey, comparer: Comparer): Enumerable; + minBy(keySelector: (item: T) => number): Enumerable; + maxBy(keySelector: (item: T) => TKey, comparer: Comparer): Enumerable; + maxBy(keySelector: (item: T) => number): Enumerable; + + share(selector: (source: Enumerable) => Enumerable): Enumerable; + share(): Enumerable; + + publish(selector: (source: Enumerable) => Enumerable): Enumerable; + publish(): Enumerable; + + memoize(): Enumerable; + + do(onNext: (value: T) => void, onError?: (error: Error) => void, onCompleted?: () => void): Enumerable; + doAction(onNext: (value: T) => void, onError?: (error: Error) => void, onCompleted?: () => void): Enumerable; + do(onbserver: Observer): Enumerable; + doAction(onbserver: Observer): Enumerable; + + bufferWithCount(count: number, skip?: number): Enumerable; + + ignoreElements(): Enumerable; + + distinctBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): Enumerable; + + distinctUntilChanged(keySelector: (item: T) => TKey, comparer?: EqualityComparer): Enumerable; + distinctUntilChanged(): Enumerable; + // if need to set comparer without keySelector + distinctUntilChanged(_: boolean, comparer: EqualityComparer): Enumerable; + + expand(selector: (item: T) => Enumerable): Enumerable; + + startWith(...values: T[]): Enumerable; + + scan(seed: TSeed, accumulate: (acc: TAccumulator, item: T) => TAccumulator): Enumerable; + scan(accumulate: (acc: T, item: T) => T): Enumerable; + + takeLast(count: number): Enumerable; + skipLast(count: number): Enumerable; + + repeat(count?: number): Enumerable; + + catch(handler: (error: Error) => Enumerable): Enumerable; + catchException(handler: (error: Error) => Enumerable): Enumerable; + catch(second: Enumerable, ...other: Enumerable[]): Enumerable; + catchException(second: Enumerable, ...other: Enumerable[]): Enumerable; + + // todo: Enumerable>.catch(): Enumerable + //catch>(): Enumerable; + + finally(finallyAction: () => void): Enumerable; + finallyDo(finallyAction: () => void): Enumerable; + + onErrorResumeNext(second: Enumerable): Enumerable; + + retry(retryCount?: number): Enumerable; + + + } + + export interface EnumerableStatic { + throw(error: Error): Enumerable; + throwException(error: Error): Enumerable; + + defer(enumerableFactory: () => Enumerable): Enumerable; + + generate( + initialState: TState, + condition: Predicate, + iterate: (state: TState) => TState, + resultSelector: (state: TState) => TResult): Enumerable; + + using( + resourceFactory: () => TResource, + enumerableFactory: (resource: TResource) => Enumerable): Enumerable; + + catch(...sources: Enumerable[]): Enumerable; + catchException(...sources: Enumerable[]): Enumerable; + + onErrorResumeNext(...sources: Enumerable[]): Enumerable; + + while(condition: EnumerablePredicate>, source: Enumerable): Enumerable; + whileDo(condition: EnumerablePredicate>, source: Enumerable): Enumerable; + + if(condition: () => boolean, thenSource: Enumerable, elseSource?: Enumerable): Enumerable; + ifThen(condition: () => boolean, thenSource: Enumerable, elseSource?: Enumerable): Enumerable; + + doWhile(source: Enumerable, condition: EnumerablePredicate>): Enumerable; + + case(selector: () => number, sources: { [key: number]: Enumerable; }, defaultSource?: Enumerable): Enumerable; + case(selector: () => string, sources: { [key: string]: Enumerable; }, defaultSource?: Enumerable): Enumerable; + switchCase(selector: () => number, sources: { [key: number]: Enumerable; }, defaultSource?: Enumerable): Enumerable; + switchCase(selector: () => string, sources: { [key: string]: Enumerable; }, defaultSource?: Enumerable): Enumerable; + + for(source: Enumerable, resultSelector: EnumerableFunc): Enumerable; + forIn(source: Enumerable, resultSelector: EnumerableFunc): Enumerable; + } +} \ No newline at end of file From 338e04943c3fc9434827b7b632116cb2e5f7a3c1 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Fri, 25 Oct 2013 17:23:09 +0400 Subject: [PATCH 04/12] Added file descriptions --- ix.js/ix.d.ts | 4 ++++ ix.js/l2o.d.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ix.js/ix.d.ts b/ix.js/ix.d.ts index 5de2361dd..9ea0ae0c9 100644 --- a/ix.js/ix.d.ts +++ b/ix.js/ix.d.ts @@ -1,3 +1,7 @@ +// Type definitions for IxJS 1.0.6 / ix.js +// Project: https://github.com/Reactive-Extensions/IxJS +// Definitions by: Igor Oleinikov + /// declare module Ix { diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts index 8177376e1..841116c46 100644 --- a/ix.js/l2o.d.ts +++ b/ix.js/l2o.d.ts @@ -1,4 +1,4 @@ -// Type definitions for IxJS 1.0.6 +// Type definitions for IxJS 1.0.6 / l2o.js // Project: https://github.com/Reactive-Extensions/IxJS // Definitions by: Igor Oleinikov From ffee8db898ae959478f523fe79653cfe859ba9cf Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Fri, 25 Oct 2013 17:30:07 +0400 Subject: [PATCH 05/12] Added missed return type for Ix.Disposable.dispose --- ix.js/l2o.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts index 841116c46..035d59234 100644 --- a/ix.js/l2o.d.ts +++ b/ix.js/l2o.d.ts @@ -4,7 +4,7 @@ declare module Ix { export interface Disposable { - dispose(); + dispose(): void; } export interface Enumerator extends Disposable { From 0efbf156721aa4e8c8c77a55b603d13f2b15f62e Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Fri, 25 Oct 2013 19:21:41 +0400 Subject: [PATCH 06/12] Fixed formatting --- ix.js/ix.d.ts | 2 - ix.js/l2o.d.ts | 414 ++++++++++++++++++++++++------------------------- 2 files changed, 207 insertions(+), 209 deletions(-) diff --git a/ix.js/ix.d.ts b/ix.js/ix.d.ts index 9ea0ae0c9..2a598dde7 100644 --- a/ix.js/ix.d.ts +++ b/ix.js/ix.d.ts @@ -74,8 +74,6 @@ declare module Ix { onErrorResumeNext(second: Enumerable): Enumerable; retry(retryCount?: number): Enumerable; - - } export interface EnumerableStatic { diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts index 035d59234..5a74c6259 100644 --- a/ix.js/l2o.d.ts +++ b/ix.js/l2o.d.ts @@ -8,263 +8,263 @@ declare module Ix { } export interface Enumerator extends Disposable { - moveNext(): boolean; - getCurrent(): T; - } + moveNext(): boolean; + getCurrent(): T; + } - export interface EnumeratorStatic { - new(moveNext: () => boolean, getCurrent: () => T, dispose: () => void): Enumerator; - create(moveNext: () => boolean, getCurrent: () => T, dispose?: () => void): Enumerator; - } + export interface EnumeratorStatic { + new (moveNext: () => boolean, getCurrent: () => T, dispose: () => void): Enumerator; + create(moveNext: () => boolean, getCurrent: () => T, dispose?: () => void): Enumerator; + } - var Enumerator: EnumerableStatic; + var Enumerator: EnumerableStatic; - export interface EnumerableFunc { - (item: T, index: number, self: Enumerable): TResult; - } - export interface EnumerablePredicate extends EnumerableFunc { } - export interface Predicate { - (item: T): boolean; - } - export interface EqualityComparer { - (item1: T1, item2: T2): boolean; - } + export interface EnumerableFunc { + (item: T, index: number, self: Enumerable): TResult; + } + export interface EnumerablePredicate extends EnumerableFunc { } + export interface Predicate { + (item: T): boolean; + } + export interface EqualityComparer { + (item1: T1, item2: T2): boolean; + } - export interface Enumerable { - // base functions - getEnumerator(): Enumerator; + export interface Enumerable { + // base functions + getEnumerator(): Enumerator; - // "extension" functions + // "extension" functions - aggregate(seed: TAccumulate, func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate, resultSelector: (accumulate: TAccumulate) => TResult): TResult; - aggregate(seed: TAccumulate, func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate): TAccumulate; - aggregate(func: (accumulate: T, current: T, index: number, self: Enumerable) => T): T; + aggregate(seed: TAccumulate, func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate, resultSelector: (accumulate: TAccumulate) => TResult): TResult; + aggregate(seed: TAccumulate, func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate): TAccumulate; + aggregate(func: (accumulate: T, current: T, index: number, self: Enumerable) => T): T; - reduce(func: (accumulate: T, current: T, index: number, self: Enumerable) => T): T; - reduce(func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate, seed: TAccumulate): TAccumulate; + reduce(func: (accumulate: T, current: T, index: number, self: Enumerable) => T): T; + reduce(func: (accumulate: TAccumulate, current: T, index: number, self: Enumerable) => TAccumulate, seed: TAccumulate): TAccumulate; - all(predicate: EnumerablePredicate, thisArg?: any): boolean; - every(predicate: EnumerablePredicate, thisArg?: any): boolean; // alias + all(predicate: EnumerablePredicate, thisArg?: any): boolean; + every(predicate: EnumerablePredicate, thisArg?: any): boolean; // alias - any(predicate?: EnumerablePredicate, thisArg?: any): boolean; - some(predicate?: EnumerablePredicate, thisArg?: any): boolean; // alias + any(predicate?: EnumerablePredicate, thisArg?: any): boolean; + some(predicate?: EnumerablePredicate, thisArg?: any): boolean; // alias - average(selector?: EnumerableFunc): number; - max(selector?: EnumerableFunc): number; - min(selector?: EnumerableFunc): number; - sum(selector?: EnumerableFunc): number; + average(selector?: EnumerableFunc): number; + max(selector?: EnumerableFunc): number; + min(selector?: EnumerableFunc): number; + sum(selector?: EnumerableFunc): number; - concat(...sources: Enumerable[]): Enumerable; + concat(...sources: Enumerable[]): Enumerable; - contains(value: TValue, comparer: EqualityComparer): boolean; - contains(value: any): boolean; + contains(value: TValue, comparer: EqualityComparer): boolean; + contains(value: any): boolean; - count(predicate?: EnumerablePredicate, thisArg?: any): number; + count(predicate?: EnumerablePredicate, thisArg?: any): number; - defaultIfEmpty(defaultValue: T): Enumerable; + defaultIfEmpty(defaultValue: T): Enumerable; - distinct(comparer?: EqualityComparer): Enumerable; + distinct(comparer?: EqualityComparer): Enumerable; - elementAt(index: number): T; - elementAtOrDefault(index: number): T; + elementAt(index: number): T; + elementAtOrDefault(index: number): T; - except(second: Enumerable, comparer?: EqualityComparer): Enumerable; + except(second: Enumerable, comparer?: EqualityComparer): Enumerable; - first(predicate?: Predicate): T; - firstOrDefault(predicate?: Predicate): T; - last(predicate?: Predicate): T; - lastOrDefault(predicate?: Predicate): T; - single(predicate?: Predicate): T; - singleOrDefault(predicate?: Predicate): T; + first(predicate?: Predicate): T; + firstOrDefault(predicate?: Predicate): T; + last(predicate?: Predicate): T; + lastOrDefault(predicate?: Predicate): T; + single(predicate?: Predicate): T; + singleOrDefault(predicate?: Predicate): T; - forEach(action: EnumerableFunc, thisArg?: any): void; + forEach(action: EnumerableFunc, thisArg?: any): void; - groupBy( - keySelector: (item: T) => TKey, - elementSelector: (item: T) => TElement, - resultSelector: (key: TKey, values: Enumerable) => TResult, - comparer?: EqualityComparer): Enumerable; - groupBy( - keySelector: (item: T) => TKey, - elementSelector: (item: T) => TElement): Grouping; - // spec 3.5.2, waiting for restriction on generative recursion removal + groupBy( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TElement, + resultSelector: (key: TKey, values: Enumerable) => TResult, + comparer?: EqualityComparer): Enumerable; + groupBy( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TElement): Grouping; + // spec 3.5.2, waiting for restriction on generative recursion removal /*groupBy( - keySelector: (item: T) => TKey): Grouping;*/ - groupBy( - keySelector: (item: T) => TKey): Grouping; + keySelector: (item: T) => TKey): Grouping;*/ + groupBy( + keySelector: (item: T) => TKey): Grouping; - // if need to set comparer without resultSelector - groupBy( - keySelector: (item: T) => TKey, - elementSelector: (item: T) => TElement, - _: boolean, - comparer: EqualityComparer): Grouping; - // if need to set resultSelector without elementSelector - groupBy( - keySelector: (item: T) => TKey, - _: boolean, - resultSelector: (key: TKey, values: Enumerable) => TResult, - comparer?: EqualityComparer): Enumerable; - // if need to set comparer without elementSelector and resultSelector - // spec 3.5.2, waiting for restriction on generative recursion removal + // if need to set comparer without resultSelector + groupBy( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TElement, + _: boolean, + comparer: EqualityComparer): Grouping; + // if need to set resultSelector without elementSelector + groupBy( + keySelector: (item: T) => TKey, + _: boolean, + resultSelector: (key: TKey, values: Enumerable) => TResult, + comparer?: EqualityComparer): Enumerable; + // if need to set comparer without elementSelector and resultSelector + // spec 3.5.2, waiting for restriction on generative recursion removal /*groupBy( - keySelector: (item: T) => TKey, - _: boolean, - __: boolean, - comparer: EqualityComparer): Grouping;*/ - groupBy( - keySelector: (item: T) => TKey, - _: boolean, - __: boolean, - comparer: EqualityComparer): Grouping; + keySelector: (item: T) => TKey, + _: boolean, + __: boolean, + comparer: EqualityComparer): Grouping;*/ + groupBy( + keySelector: (item: T) => TKey, + _: boolean, + __: boolean, + comparer: EqualityComparer): Grouping; - groupJoin( - inner: Enumerable, - outerKeySelector: (item: T) => TOuterKey, - innerKeySelector: (item: TInner) => TInnerKey, - resultSelector: (outer: T, innerSequence: Enumerable) => TResult, - comparer: EqualityComparer): Enumerable; - groupJoin( - inner: Enumerable, - outerKeySelector: (item: T) => TKey, - innerKeySelector: (item: TInner) => TKey, - resultSelector: (outer: T, innerSequence: Enumerable) => TResult): Enumerable; + groupJoin( + inner: Enumerable, + outerKeySelector: (item: T) => TOuterKey, + innerKeySelector: (item: TInner) => TInnerKey, + resultSelector: (outer: T, innerSequence: Enumerable) => TResult, + comparer: EqualityComparer): Enumerable; + groupJoin( + inner: Enumerable, + outerKeySelector: (item: T) => TKey, + innerKeySelector: (item: TInner) => TKey, + resultSelector: (outer: T, innerSequence: Enumerable) => TResult): Enumerable; - join( - inner: Enumerable, - outerKeySelector: (item: T) => TOuterKey, - innerKeySelector: (item: TInner) => TInnerKey, - resultSelector: (outer: T, inner: TInner) => TResult, - comparer: EqualityComparer): Enumerable; - join( - inner: Enumerable, - outerKeySelector: (item: T) => TKey, - innerKeySelector: (item: TInner) => TKey, - resultSelector: (outer: T, inner: TInner) => TResult): Enumerable; + join( + inner: Enumerable, + outerKeySelector: (item: T) => TOuterKey, + innerKeySelector: (item: TInner) => TInnerKey, + resultSelector: (outer: T, inner: TInner) => TResult, + comparer: EqualityComparer): Enumerable; + join( + inner: Enumerable, + outerKeySelector: (item: T) => TKey, + innerKeySelector: (item: TInner) => TKey, + resultSelector: (outer: T, inner: TInner) => TResult): Enumerable; - intersect(second: Enumerable, comparer: EqualityComparer): Enumerable; - intersect(second: Enumerable): Enumerable; - union(second: Enumerable, comparer?: EqualityComparer): Enumerable; + intersect(second: Enumerable, comparer: EqualityComparer): Enumerable; + intersect(second: Enumerable): Enumerable; + union(second: Enumerable, comparer?: EqualityComparer): Enumerable; - orderBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; - orderByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + orderBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + orderByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; - reverse(): Enumerable; + reverse(): Enumerable; - select(selector: EnumerableFunc, thisArg?: any): Enumerable; - map(selector: EnumerableFunc, thisArg?: any): Enumerable; + select(selector: EnumerableFunc, thisArg?: any): Enumerable; + map(selector: EnumerableFunc, thisArg?: any): Enumerable; - selectMany(collectionSelector: (item: T, index: number) => Enumerable, - resultSelector: (outer: T, inner: TCollection) => TResult): Enumerable; - selectMany(collectionSelector: (item: T, index: number) => Enumerable): Enumerable; + selectMany(collectionSelector: (item: T, index: number) => Enumerable, + resultSelector: (outer: T, inner: TCollection) => TResult): Enumerable; + selectMany(collectionSelector: (item: T, index: number) => Enumerable): Enumerable; - sequenceEqual(second: Enumerable, comparer: EqualityComparer): boolean; - sequenceEqual(second: Enumerable): boolean; + sequenceEqual(second: Enumerable, comparer: EqualityComparer): boolean; + sequenceEqual(second: Enumerable): boolean; - skip(count: number): Enumerable; - skipWhile(selector: EnumerablePredicate, thisArg?: any): Enumerable; - take(count: number): Enumerable; - takeWhile(selector: EnumerablePredicate, thisArg?: any): Enumerable; + skip(count: number): Enumerable; + skipWhile(selector: EnumerablePredicate, thisArg?: any): Enumerable; + take(count: number): Enumerable; + takeWhile(selector: EnumerablePredicate, thisArg?: any): Enumerable; - toArray(): T[]; + toArray(): T[]; - toDictionary( - keySelector: (item: T) => TKey, - elementSelector: (item: T) => TValue, - comparer?: EqualityComparer): Dictionary; - // spec 3.5.2, waiting for restriction on generative recursion removal + toDictionary( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TValue, + comparer?: EqualityComparer): Dictionary; + // spec 3.5.2, waiting for restriction on generative recursion removal /*toDictionary( - keySelector: (item: T) => TKey): Dictionary;*/ - toDictionary( - keySelector: (item: T) => TKey): Dictionary; - // if need to set comparer without elementSelector - // spec 3.5.2, waiting for restriction on generative recursion removal + keySelector: (item: T) => TKey): Dictionary;*/ + toDictionary( + keySelector: (item: T) => TKey): Dictionary; + // if need to set comparer without elementSelector + // spec 3.5.2, waiting for restriction on generative recursion removal /*toDictionary( - keySelector: (item: T) => TKey, - _: boolean, - comparer: EqualityComparer): Dictionary;*/ - toDictionary( - keySelector: (item: T) => TKey, - _: boolean, - comparer: EqualityComparer): Dictionary; + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Dictionary;*/ + toDictionary( + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Dictionary; - toLookup( - keySelector: (item: T) => TKey, - elementSelector: (item: T) => TValue, - comparer?: EqualityComparer): Lookup; - // spec 3.5.2, waiting for restriction on generative recursion removal + toLookup( + keySelector: (item: T) => TKey, + elementSelector: (item: T) => TValue, + comparer?: EqualityComparer): Lookup; + // spec 3.5.2, waiting for restriction on generative recursion removal /*toLookup( - keySelector: (item: T) => TKey): Lookup;*/ - toLookup( - keySelector: (item: T) => TKey): Lookup; - // if need to set comparer without elementSelector - // spec 3.5.2, waiting for restriction on generative recursion removal + keySelector: (item: T) => TKey): Lookup;*/ + toLookup( + keySelector: (item: T) => TKey): Lookup; + // if need to set comparer without elementSelector + // spec 3.5.2, waiting for restriction on generative recursion removal /*toLookup( - keySelector: (item: T) => TKey, - _: boolean, - comparer: EqualityComparer): Lookup;*/ - toLookup( - keySelector: (item: T) => TKey, - _: boolean, - comparer: EqualityComparer): Lookup; + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Lookup;*/ + toLookup( + keySelector: (item: T) => TKey, + _: boolean, + comparer: EqualityComparer): Lookup; - where(selector: EnumerablePredicate, thisArg?: any): Enumerable; - filter(selector: EnumerablePredicate, thisArg?: any): Enumerable; + where(selector: EnumerablePredicate, thisArg?: any): Enumerable; + filter(selector: EnumerablePredicate, thisArg?: any): Enumerable; - zip(right: Enumerable, selector: (left: T, right: TRight) => TResult): Enumerable; - } + zip(right: Enumerable, selector: (left: T, right: TRight) => TResult): Enumerable; + } - export interface Grouping extends Enumerable { - key: TKey; - } + export interface Grouping extends Enumerable { + key: TKey; + } - export interface OrderedEnumerable extends Enumerable { - thenBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; - thenByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; - } + export interface OrderedEnumerable extends Enumerable { + thenBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + thenByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + } - class Dictionary { - constructor(capacity, comparer?: EqualityComparer); + class Dictionary { + constructor(capacity, comparer?: EqualityComparer); - toEnumerable(): Enumerable>; + toEnumerable(): Enumerable>; - add(key: TKey, value: TValue): void; - remove(key: TKey): boolean; - clear(): void; - length(): number; - tryGetValue(key: TKey): TValue; - get(key: TKey): TValue; - set(key: TKey, value: TValue): void; - getValues(): TValue[]; - has(key: TKey): boolean; - } + add(key: TKey, value: TValue): void; + remove(key: TKey): boolean; + clear(): void; + length(): number; + tryGetValue(key: TKey): TValue; + get(key: TKey): TValue; + set(key: TKey, value: TValue): void; + getValues(): TValue[]; + has(key: TKey): boolean; + } - export interface KeyValuePair { - key: TKey; - value: TValue; - } + export interface KeyValuePair { + key: TKey; + value: TValue; + } - export interface Lookup { - toEnumerable(): Enumerable>; - has(key: TKey): boolean; - length(): number; - get(key: TKey): Enumerable; - } + export interface Lookup { + toEnumerable(): Enumerable>; + has(key: TKey): boolean; + length(): number; + get(key: TKey): Enumerable; + } - export interface EnumerableStatic { - new (getEnumerator: () => Enumerator): Enumerable; - create(getEnumerator: () => Enumerator): Enumerable; + export interface EnumerableStatic { + new (getEnumerator: () => Enumerator): Enumerable; + create(getEnumerator: () => Enumerator): Enumerable; - concat(...sources: Enumerable[]): Enumerable; - empty(): Enumerable; - fromArray(array: T[]): Enumerable; - returnValue(value: T): Enumerable; - range(start: number, count: number): Enumerable; - repeat(value: T, repeatCount?: number): Enumerable; + concat(...sources: Enumerable[]): Enumerable; + empty(): Enumerable; + fromArray(array: T[]): Enumerable; + returnValue(value: T): Enumerable; + range(start: number, count: number): Enumerable; + repeat(value: T, repeatCount?: number): Enumerable; - sequenceEqual(first: Enumerable, second: Enumerable, comparer: EqualityComparer): boolean; - sequenceEqual(first: Enumerable, second: Enumerable): boolean; - } + sequenceEqual(first: Enumerable, second: Enumerable, comparer: EqualityComparer): boolean; + sequenceEqual(first: Enumerable, second: Enumerable): boolean; + } - var Enumerable: EnumerableStatic; + var Enumerable: EnumerableStatic; } \ No newline at end of file From 0963cde2eec119b8d48f87ad37af294eca0f1eb8 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Sat, 26 Oct 2013 14:39:04 +0400 Subject: [PATCH 07/12] Fixed several bugs in l2o.d.ts - fixed Enumerator variable type - added Comparer interface - added return alias for returnValue - minor fixes --- ix.js/l2o.d.ts | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts index 5a74c6259..44a5efda4 100644 --- a/ix.js/l2o.d.ts +++ b/ix.js/l2o.d.ts @@ -17,7 +17,7 @@ declare module Ix { create(moveNext: () => boolean, getCurrent: () => T, dispose?: () => void): Enumerator; } - var Enumerator: EnumerableStatic; + var Enumerator: EnumeratorStatic; export interface EnumerableFunc { (item: T, index: number, self: Enumerable): TResult; @@ -26,8 +26,11 @@ declare module Ix { export interface Predicate { (item: T): boolean; } - export interface EqualityComparer { - (item1: T1, item2: T2): boolean; + export interface EqualityComparer { + (item1: TFirst, item2: TSecond): boolean; + } + export interface Comparer { + (item1: TFirst, item2: TSecond): number; } export interface Enumerable { @@ -57,18 +60,19 @@ declare module Ix { concat(...sources: Enumerable[]): Enumerable; contains(value: TValue, comparer: EqualityComparer): boolean; - contains(value: any): boolean; + contains(value: T): boolean; count(predicate?: EnumerablePredicate, thisArg?: any): number; - defaultIfEmpty(defaultValue: T): Enumerable; + defaultIfEmpty(defaultValue?: T): Enumerable; distinct(comparer?: EqualityComparer): Enumerable; elementAt(index: number): T; elementAtOrDefault(index: number): T; - except(second: Enumerable, comparer?: EqualityComparer): Enumerable; + except(second: Enumerable, comparer: EqualityComparer): Enumerable; + except(second: Enumerable): Enumerable; first(predicate?: Predicate): T; firstOrDefault(predicate?: Predicate): T; @@ -146,8 +150,8 @@ declare module Ix { intersect(second: Enumerable): Enumerable; union(second: Enumerable, comparer?: EqualityComparer): Enumerable; - orderBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; - orderByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + orderBy(keySelector: (item: T) => TKey, comparer?: Comparer): OrderedEnumerable; + orderByDescending(keySelector: (item: T) => TKey, comparer?: Comparer): OrderedEnumerable; reverse(): Enumerable; @@ -219,12 +223,12 @@ declare module Ix { } export interface OrderedEnumerable extends Enumerable { - thenBy(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; - thenByDescending(keySelector: (item: T) => TKey, comparer?: EqualityComparer): OrderedEnumerable; + thenBy(keySelector: (item: T) => TKey, comparer?: Comparer): OrderedEnumerable; + thenByDescending(keySelector: (item: T) => TKey, comparer?: Comparer): OrderedEnumerable; } class Dictionary { - constructor(capacity, comparer?: EqualityComparer); + constructor(capacity?: number, comparer?: EqualityComparer); toEnumerable(): Enumerable>; @@ -258,7 +262,8 @@ declare module Ix { concat(...sources: Enumerable[]): Enumerable; empty(): Enumerable; fromArray(array: T[]): Enumerable; - returnValue(value: T): Enumerable; + return(value: T): Enumerable; + returnValue(value: T): Enumerable; // alias for ; repeat(value: T, repeatCount?: number): Enumerable; From 6dd6462da3c71ec409a48e5ae33813b2fb3de4c0 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Sat, 26 Oct 2013 14:39:55 +0400 Subject: [PATCH 08/12] Added tests for l2o.d.ts Tests for all functions defined in Enumerable and EnumerableStatic --- ix.js/l2o-tests.ts | 160 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 ix.js/l2o-tests.ts diff --git a/ix.js/l2o-tests.ts b/ix.js/l2o-tests.ts new file mode 100644 index 000000000..4be2974b3 --- /dev/null +++ b/ix.js/l2o-tests.ts @@ -0,0 +1,160 @@ +/// + +var ec_ns = (a: number, b: string) => a.toString() == b; //equality comparer on number,string +var ec_nn = (a: number, b: number) => a === b; //equality comparer on number,number +var c_nn = (a: number, b: number) => a - b; //comparer on number,number + +// static + +var ax = Ix.Enumerable.fromArray([0, 2, 7, 3, 4, 5]); + +var bx = Ix.Enumerable.create(() => { + var current = "."; + return Ix.Enumerator.create( + () => { current += "."; return true; }, + () => current, + () => { }); +}); + +Ix.Enumerator.create(() => true, () => 1); // without dispose method + +var cx = Ix.Enumerable.empty(); + +var dx = Ix.Enumerable.concat(ax, cx); + +var ex = Ix.Enumerable.return(42); +var fx = Ix.Enumerable.returnValue("42"); + +var gx = Ix.Enumerable.range(-100, 200); + +Ix.Enumerable.repeat(42, 42); +Ix.Enumerable.repeat(42); // infinite + +Ix.Enumerable.sequenceEqual(ax, fx, ec_ns); +Ix.Enumerable.sequenceEqual(ax, ex); // default comparer on same type + +// instance + +ax.getEnumerator(); + +ax.aggregate("", (acc, i) => acc + i, acc=> acc.length); +ax.aggregate("", (acc, i) => acc + i); +ax.aggregate((acc, i) => acc + i); + +ax.reduce((acc, i) => acc + i, 100); +ax.reduce((acc, i) => acc + i); + +ax.all(item => true); +ax.all(item => true, bx); +ax.every(item => true); +ax.every(item => true, bx); + +ax.any(); +ax.any(item => true); +ax.any(item => true, bx); +ax.some(); +ax.some(item => true); +ax.some(item => true, bx); + +ax.average(); +bx.average(item => item.length); +ax.min(); +bx.min(item => item.length); +ax.max(); +bx.max(item => item.length); +ax.sum(); +bx.sum(item => item.length); + +ax.concat(ax, cx, dx, ex, gx); + +ax.contains(10); +ax.contains("10", ec_ns); + +ax.count(); +ax.count(item=>false); +ax.count(item=> false, {}); + +cx.defaultIfEmpty(); +cx.defaultIfEmpty(10); + +dx.distinct(); +dx.distinct((d1, d2) => d1 === d2); + +ax.elementAt(2); +ax.elementAtOrDefault(2); + +//ax.except(bx, ec_ns); // bug https://typescript.codeplex.com/workitem/1841 +bx.except(fx); + +ax.first(); +ax.firstOrDefault(); +ax.last(); +ax.lastOrDefault(); +ax.single(); +ax.singleOrDefault(); + +ax.forEach(a => console.log(a)); +ax.forEach(a => console.log(a), cx); + +bx.groupBy(b => b.length); +bx.groupBy(b => b.length, b => "[" + b + "]"); +bx.groupBy(b => b.length, b => "[" + b + "]", (l, values) => l + values.count()); +bx.groupBy(b => b.length, false, (l, values) => l + values.count()); +bx.groupBy(b => b.length, b => "[" + b + "]", (l, values) => l + values.count(), ec_nn); +bx.groupBy(b => b.length, b => "[" + b + "]", false, (x, y) => x == y); +bx.groupBy(b => b.length, false, (l, values) => l + values.count(), ec_nn); +bx.groupBy(b => b.length, false, false, ec_nn); + +ax.groupJoin(bx, a => a, b => b, (a, b) => [a, b], ec_ns); +ax.groupJoin(bx, a => a, b => b.length, (a, b) => [a, b]); + +ax.join(bx, a => a, b => b, (a, b) => [a, b], ec_ns); +ax.join(bx, a => a, b => b.length, (a, b) => [a, b]); + +//ax.intersect(bx, ec_ns); // bug https://typescript.codeplex.com/workitem/1841 +ax.intersect(cx); +ax.union(cx); + +ax.orderBy(a=> -a).thenBy(a => a); +ax.orderBy(a=> -a, c_nn).thenBy(a => a, c_nn); +ax.orderByDescending(a=> -a).thenByDescending(a => a); +ax.orderByDescending(a=> -a, c_nn).thenByDescending(a => a, c_nn); + +ax.reverse(); + +ax.select(a=> a.toString()); +ax.select(a=> a.toString(), {}); +ax.map(a=> a.toString()); +ax.map(a=> a.toString(), {}); + +ax.selectMany(a=> bx); +ax.selectMany(a=> bx, (a, b) => [a, b]); + +ax.sequenceEqual(fx, ec_ns); +ax.sequenceEqual(ax, ec_nn); +ax.sequenceEqual(cx); + +ax.skip(10); +ax.skipWhile(a => a > 10); +ax.take(10); +ax.takeWhile(a => a > 10); + +ax.toArray(); + +bx.toDictionary(b => b.length, b => 10, ec_nn); +bx.toDictionary(b => b.length, false, ec_nn); +bx.toDictionary(b => b.length, b => 10); +bx.toDictionary(b => b.length); + +bx.toLookup(b => b.length, b => 10, ec_nn); +bx.toLookup(b => b.length, false, ec_nn); +bx.toLookup(b => b.length, b => 10); +bx.toLookup(b => b.length); + +ax.where(a=> a > 10, {}); +ax.where(a=> a > 10); +ax.filter(a=> a > 10, {}); +ax.filter(a=> a > 10); + +ax.zip(bx, (a: number, b: string) => [a, b]); +ax.zip(bx, (a, b) => [a, b]); From 019e4dd6670790793f2ca721f61ba4923e61bf2d Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Sat, 26 Oct 2013 14:56:18 +0400 Subject: [PATCH 09/12] Removed Comparer from ix.d.ts (alreadu defined in l2o.d.ts) --- ix.js/ix.d.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ix.js/ix.d.ts b/ix.js/ix.d.ts index 2a598dde7..d138b007d 100644 --- a/ix.js/ix.d.ts +++ b/ix.js/ix.d.ts @@ -6,10 +6,6 @@ declare module Ix { - export interface Comparer { - (item1: T1, item2: T2): number; - } - export interface Observer { onNext? (value: T): void; onError? (error: Error): void; @@ -113,4 +109,4 @@ declare module Ix { for(source: Enumerable, resultSelector: EnumerableFunc): Enumerable; forIn(source: Enumerable, resultSelector: EnumerableFunc): Enumerable; } -} \ No newline at end of file +} From af0f9c4bf5af0178be1b881b97f81351c3545560 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Sat, 26 Oct 2013 14:58:43 +0400 Subject: [PATCH 10/12] Added tests for ix.d.ts Tested all functions defined in ix.d.ts in EnumerableStatic --- ix.js/ix-tests.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 ix.js/ix-tests.ts diff --git a/ix.js/ix-tests.ts b/ix.js/ix-tests.ts new file mode 100644 index 000000000..dc44f1589 --- /dev/null +++ b/ix.js/ix-tests.ts @@ -0,0 +1,46 @@ +/// + +var ec_ns = (a: number, b: string) => a.toString() == b; //equality comparer on number,string +var ec_nn = (a: number, b: number) => a === b; //equality comparer on number,number +var c_nn = (a: number, b: number) => a - b; //comparer on number,number + +// static + +Ix.Enumerable.throw(new Error("error")); +Ix.Enumerable.throwException(new Error("error")); + +var ax = Ix.Enumerable.generate(-100, a => a < 100, a=> a + 10, a=> a * 2); + +Ix.Enumerable.defer(() => ax); + +Ix.Enumerable.using(() => ax.getEnumerator(), e => Ix.Enumerable.return(e.getCurrent())); + +Ix.Enumerable.catch(ax, ax, ax); +Ix.Enumerable.catchException(ax, ax, ax); +Ix.Enumerable.catch(); +Ix.Enumerable.catchException(); + +Ix.Enumerable.onErrorResumeNext(ax, ax, ax); +Ix.Enumerable.onErrorResumeNext(); + +Ix.Enumerable.while(x => x.count() > 0, ax); +Ix.Enumerable.whileDo(x => x.count() > 0, ax); + +Ix.Enumerable.if(() => true, ax, ax); +Ix.Enumerable.ifThen(() => true, ax, ax); +Ix.Enumerable.if(() => true, ax); +Ix.Enumerable.ifThen(() => true, ax); + +Ix.Enumerable.doWhile(ax, x => x.count() > 0); + +Ix.Enumerable.case(() => 42, { 42: ax }, ax); +Ix.Enumerable.switchCase(() => 42, { 42: ax }, ax); +Ix.Enumerable.case(() => 42, { 42: ax }); +Ix.Enumerable.switchCase(() => 42, { 42: ax }); +Ix.Enumerable.case(() => "42", { "42": ax }, ax); +Ix.Enumerable.switchCase(() => "42", { "42": ax }, ax); +Ix.Enumerable.case(() => "42", { "42": ax }); +Ix.Enumerable.switchCase(() => "42", { "42": ax }); + +Ix.Enumerable.for(ax, a => ax); +Ix.Enumerable.forIn(ax, a => ax); From 2b99487a28219716fd7fa8a20b04fe664d5a4be7 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Sat, 26 Oct 2013 16:24:49 +0400 Subject: [PATCH 11/12] Added tests for ix.d.ts - added tests of all functions defined in ix.d.ts Enumerable - minor fix in ix.d.ts --- ix.js/ix-tests.ts | 70 +++++++++++++++++++++++++++++++++++++++++++++++ ix.js/ix.d.ts | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/ix.js/ix-tests.ts b/ix.js/ix-tests.ts index dc44f1589..6953621ca 100644 --- a/ix.js/ix-tests.ts +++ b/ix.js/ix-tests.ts @@ -1,6 +1,7 @@ /// var ec_ns = (a: number, b: string) => a.toString() == b; //equality comparer on number,string +var ec_ss = (a: string, b: string) => a == b; //equality comparer on string,string var ec_nn = (a: number, b: number) => a === b; //equality comparer on number,number var c_nn = (a: number, b: number) => a - b; //comparer on number,number @@ -44,3 +45,72 @@ Ix.Enumerable.switchCase(() => "42", { "42": ax }); Ix.Enumerable.for(ax, a => ax); Ix.Enumerable.forIn(ax, a => ax); + +// instance + +var bx: Ix.Enumerable; + +ax.isEmpty(); + +bx.minBy(b => b.length, c_nn); +bx.minBy(b => b.length); +bx.maxBy(b => b.length, c_nn); +bx.maxBy(b => b.length); + +ax.share(ax => bx); +ax.share(); + +ax.publish(ax => bx); +ax.publish(); + +ax.memoize(); + +ax.do({ onNext: (a: number) => console.log(a), onError: err => console.log(err), onCompleted: () => console.log("completed") }); +ax.do(a => console.log(a), err => console.log(err), () => console.log("completed")); +ax.do(a => console.log(a), err => console.log(err)); +ax.do((a: number) => console.log(a)); +ax.doAction({ onNext: (a: number) => console.log(a), onError: err => console.log(err), onCompleted: () => console.log("completed") }); +ax.doAction(a => console.log(a), err => console.log(err), () => console.log("completed")); +ax.doAction(a => console.log(a), err => console.log(err)); +ax.doAction((a: number) => console.log(a)); + +ax.bufferWithCount(10, 20); +ax.bufferWithCount(10); + +ax.ignoreElements(); + +bx.distinctBy(b => b.length, ec_nn); +bx.distinctBy(b => b.length); + +bx.distinctUntilChanged(b => b.length, ec_nn); +bx.distinctUntilChanged(b => b.length); +bx.distinctUntilChanged(); +bx.distinctUntilChanged(false, ec_ss); + +ax.expand(a => ax); + +ax.startWith(10, 20); + +ax.scan(0, (acc, a) => acc + a); +ax.scan((acc, a) => acc + a); + +ax.takeLast(10); +ax.skipLast(10); + +ax.repeat(10); +ax.repeat(); + +ax.catch(ax, ax, ax); +ax.catchException(ax, ax, ax); +ax.catch(ax); +ax.catchException(ax); +ax.catch(err => ax); +ax.catchException(err => ax); + +ax.finally(() => { }); +ax.finallyDo(() => { }); + +ax.onErrorResumeNext(ax); + +ax.retry(10); +ax.retry(); diff --git a/ix.js/ix.d.ts b/ix.js/ix.d.ts index d138b007d..614a950fb 100644 --- a/ix.js/ix.d.ts +++ b/ix.js/ix.d.ts @@ -67,7 +67,7 @@ declare module Ix { finally(finallyAction: () => void): Enumerable; finallyDo(finallyAction: () => void): Enumerable; - onErrorResumeNext(second: Enumerable): Enumerable; + onErrorResumeNext(second: Enumerable): Enumerable; retry(retryCount?: number): Enumerable; } From 68427a3c830d6197c8c526745021031e902265c1 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Sat, 26 Oct 2013 17:10:50 +0400 Subject: [PATCH 12/12] Added tests for Disposable, Enumerator, Dictionary, Lookup - added tests for all functions defined in l2o.d.ts in Disposable, Enumerator, Dictionary, Lookup - removed workaround definitions for spec#3.5.2 (it produced more problems) - fixed Lookup.toEnumerable --- ix.js/l2o-tests.ts | 73 ++++++++++++++++++++++++++++++++++++++++++---- ix.js/l2o.d.ts | 21 +------------ 2 files changed, 68 insertions(+), 26 deletions(-) diff --git a/ix.js/l2o-tests.ts b/ix.js/l2o-tests.ts index 4be2974b3..2399d4e9f 100644 --- a/ix.js/l2o-tests.ts +++ b/ix.js/l2o-tests.ts @@ -96,14 +96,14 @@ ax.singleOrDefault(); ax.forEach(a => console.log(a)); ax.forEach(a => console.log(a), cx); -bx.groupBy(b => b.length); +//bx.groupBy(b => b.length); // spec 3.5.2, waiting for restriction on generative recursion removal bx.groupBy(b => b.length, b => "[" + b + "]"); bx.groupBy(b => b.length, b => "[" + b + "]", (l, values) => l + values.count()); bx.groupBy(b => b.length, false, (l, values) => l + values.count()); bx.groupBy(b => b.length, b => "[" + b + "]", (l, values) => l + values.count(), ec_nn); bx.groupBy(b => b.length, b => "[" + b + "]", false, (x, y) => x == y); bx.groupBy(b => b.length, false, (l, values) => l + values.count(), ec_nn); -bx.groupBy(b => b.length, false, false, ec_nn); +//bx.groupBy(b => b.length, false, false, ec_nn); // spec 3.5.2, waiting for restriction on generative recursion removal ax.groupJoin(bx, a => a, b => b, (a, b) => [a, b], ec_ns); ax.groupJoin(bx, a => a, b => b.length, (a, b) => [a, b]); @@ -142,14 +142,14 @@ ax.takeWhile(a => a > 10); ax.toArray(); bx.toDictionary(b => b.length, b => 10, ec_nn); -bx.toDictionary(b => b.length, false, ec_nn); +//bx.toDictionary(b => b.length, false, ec_nn); // spec 3.5.2, waiting for restriction on generative recursion removal bx.toDictionary(b => b.length, b => 10); -bx.toDictionary(b => b.length); +//bx.toDictionary(b => b.length); // spec 3.5.2, waiting for restriction on generative recursion removal bx.toLookup(b => b.length, b => 10, ec_nn); -bx.toLookup(b => b.length, false, ec_nn); +//bx.toLookup(b => b.length, false, ec_nn); // spec 3.5.2, waiting for restriction on generative recursion removal bx.toLookup(b => b.length, b => 10); -bx.toLookup(b => b.length); +//bx.toLookup(b => b.length); // spec 3.5.2, waiting for restriction on generative recursion removal ax.where(a=> a > 10, {}); ax.where(a=> a > 10); @@ -158,3 +158,64 @@ ax.filter(a=> a > 10); ax.zip(bx, (a: number, b: string) => [a, b]); ax.zip(bx, (a, b) => [a, b]); + +// Disposable + +{ + var d: Ix.Disposable; + + d.dispose(); +} + +// Enumerator + +{ + var e: Ix.Enumerator; + + try { + while (e.moveNext()) { var c = e.getCurrent(); } + } + finally { + e.dispose(); + } +} + +// Dictionary + +{ + var dic = new Ix.Dictionary(0, ec_nn); + + var key = dic.toEnumerable().first().key; + var value = dic.toEnumerable().first().value; + + dic.add(1, "1"); + dic.remove(1); + dic.clear(); + dic.length(); + dic.tryGetValue(1); + dic.get(1); + dic.set(1, "1"); + dic.getValues(); + dic.has(1); +} + +// KeyValuePair + +{ + var kv: Ix.KeyValuePair; + var key = kv.key; + var value = kv.value; +} + +// Lookup + +{ + var lookup: Ix.Lookup; + + var key = lookup.toEnumerable().first().key; + lookup.toEnumerable().first().first(); + + lookup.has(1); + lookup.length(); + lookup.get(1).first(); +} \ No newline at end of file diff --git a/ix.js/l2o.d.ts b/ix.js/l2o.d.ts index 44a5efda4..c3f3c415e 100644 --- a/ix.js/l2o.d.ts +++ b/ix.js/l2o.d.ts @@ -94,8 +94,6 @@ declare module Ix { // spec 3.5.2, waiting for restriction on generative recursion removal /*groupBy( keySelector: (item: T) => TKey): Grouping;*/ - groupBy( - keySelector: (item: T) => TKey): Grouping; // if need to set comparer without resultSelector groupBy( @@ -116,11 +114,6 @@ declare module Ix { _: boolean, __: boolean, comparer: EqualityComparer): Grouping;*/ - groupBy( - keySelector: (item: T) => TKey, - _: boolean, - __: boolean, - comparer: EqualityComparer): Grouping; groupJoin( inner: Enumerable, @@ -179,18 +172,12 @@ declare module Ix { // spec 3.5.2, waiting for restriction on generative recursion removal /*toDictionary( keySelector: (item: T) => TKey): Dictionary;*/ - toDictionary( - keySelector: (item: T) => TKey): Dictionary; // if need to set comparer without elementSelector // spec 3.5.2, waiting for restriction on generative recursion removal /*toDictionary( keySelector: (item: T) => TKey, _: boolean, comparer: EqualityComparer): Dictionary;*/ - toDictionary( - keySelector: (item: T) => TKey, - _: boolean, - comparer: EqualityComparer): Dictionary; toLookup( keySelector: (item: T) => TKey, @@ -199,18 +186,12 @@ declare module Ix { // spec 3.5.2, waiting for restriction on generative recursion removal /*toLookup( keySelector: (item: T) => TKey): Lookup;*/ - toLookup( - keySelector: (item: T) => TKey): Lookup; // if need to set comparer without elementSelector // spec 3.5.2, waiting for restriction on generative recursion removal /*toLookup( keySelector: (item: T) => TKey, _: boolean, comparer: EqualityComparer): Lookup;*/ - toLookup( - keySelector: (item: T) => TKey, - _: boolean, - comparer: EqualityComparer): Lookup; where(selector: EnumerablePredicate, thisArg?: any): Enumerable; filter(selector: EnumerablePredicate, thisArg?: any): Enumerable; @@ -249,7 +230,7 @@ declare module Ix { } export interface Lookup { - toEnumerable(): Enumerable>; + toEnumerable(): Enumerable>; has(key: TKey): boolean; length(): number; get(key: TKey): Enumerable;