Skip to content

Commit

Permalink
selectMany now accepts arrays in projection.
Browse files Browse the repository at this point in the history
  • Loading branch information
BSick7 committed Apr 21, 2014
1 parent beb9d61 commit 91338ca
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 7 deletions.
2 changes: 2 additions & 0 deletions dist/ex.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ declare module exjs {
reverse(): IEnumerable<T>;
select<TResult>(selector: (t: T, index?: number) => TResult): IEnumerable<TResult>;
selectMany<TResult>(selector: (t: T) => IEnumerable<TResult>): IEnumerable<TResult>;
selectMany<TResult>(selector: (t: T) => TResult[]): IEnumerable<TResult>;
skip(count: number): IEnumerable<T>;
skipWhile(predicate: (t: T, index?: number) => boolean): IEnumerable<T>;
sum(selector?: (t: T) => number): number;
Expand Down Expand Up @@ -75,6 +76,7 @@ declare module exjs {
public reverse(): IEnumerable<T>;
public select<TResult>(selector: (t: T, index?: number) => TResult): IEnumerable<TResult>;
public selectMany<TResult>(selector: (t: T) => IEnumerable<TResult>): IEnumerable<TResult>;
public selectMany<TResult>(selector: (t: T) => TResult[]): IEnumerable<TResult>;
public skip(count: number): IEnumerable<T>;
public skipWhile(predicate: (t: T, index?: number) => boolean): IEnumerable<T>;
public sum(selector?: (t: T) => number): number;
Expand Down
9 changes: 7 additions & 2 deletions dist/ex.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,11 @@ var exjs;
Enumerable.prototype.select = function (selector) {
throw new Error("Not implemented");
};

Enumerable.prototype.selectMany = function (selector) {
throw new Error("Not implemented");
};

Enumerable.prototype.skip = function (count) {
throw new Error("Not implemented");
};
Expand Down Expand Up @@ -695,7 +697,6 @@ var exjs;

function selectManyEnumerator(prev, selector) {
var t;
var j = 0;
var active;
var e = {
current: undefined,
Expand All @@ -706,7 +707,11 @@ var exjs;
while (!active || !active.moveNext()) {
if (!t.moveNext())
return false;
active = selector(t.current).getEnumerator();
var selected = selector(t.current);
var en = selected;
if (en instanceof Array)
en = en.en();
active = en.getEnumerator();
}
e.current = active.current;
return true;
Expand Down
7 changes: 6 additions & 1 deletion src/enumerable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ module exjs {
reverse(): IEnumerable<T>;
select<TResult>(selector: (t: T, index?: number) => TResult): IEnumerable<TResult>;
selectMany<TResult>(selector: (t: T) => IEnumerable<TResult>): IEnumerable<TResult>;
selectMany<TResult>(selector: (t: T) => TResult[]): IEnumerable<TResult>;
skip(count: number): IEnumerable<T>;
skipWhile(predicate: (t: T, index?: number) => boolean): IEnumerable<T>;
sum(selector?: (t: T) => number): number;
Expand Down Expand Up @@ -190,7 +191,11 @@ module exjs {
orderByDescending<TKey>(keySelector: (t: T) => TKey, comparer?: (f: TKey, s: TKey) => number): IOrderedEnumerable<T> { throw new Error("Not implemented"); }
reverse(): IEnumerable<T> { throw new Error("Not implemented"); }
select<TResult>(selector: (t: T, index?: number) => TResult): IEnumerable<TResult> { throw new Error("Not implemented"); }
selectMany<TResult>(selector: (t: T) => IEnumerable<TResult>): IEnumerable<TResult> { throw new Error("Not implemented"); }

selectMany<TResult>(selector: (t: T) => IEnumerable<TResult>): IEnumerable<TResult>;
selectMany<TResult>(selector: (t: T) => TResult[]): IEnumerable<TResult>;
selectMany<TResult>(selector: (t: T) => any): IEnumerable<TResult> { throw new Error("Not implemented"); }

skip(count: number): IEnumerable<T> { throw new Error("Not implemented"); }
skipWhile(predicate: (t: T, index?: number) => boolean): IEnumerable<T> { throw new Error("Not implemented"); }
sum(selector?: (t: T) => number): number {
Expand Down
12 changes: 8 additions & 4 deletions src/select.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/// <reference path="enumerable.ts" />
/// <reference path="array.ts" />

module exjs {
function selectEnumerator<T, TResult>(prev: IEnumerable<T>, selector: (t: T, index?: number) => TResult): IEnumerator<TResult> {
Expand All @@ -17,9 +18,8 @@ module exjs {
return e;
}

function selectManyEnumerator<T, TResult>(prev: IEnumerable<T>, selector: (t: T) => IEnumerable<TResult>): IEnumerator<TResult> {
function selectManyEnumerator<T, TResult>(prev: IEnumerable<T>, selector: (t: T) => any): IEnumerator<TResult> {
var t: IEnumerator<T>;
var j = 0;
var active: IEnumerator<TResult>;
var e = {
current: undefined,
Expand All @@ -29,7 +29,11 @@ module exjs {
while (!active || !active.moveNext()) {
if (!t.moveNext())
return false;
active = selector(t.current).getEnumerator();
var selected = selector(t.current);
var en:IEnumerable<TResult> = selected;
if (en instanceof Array)
en = (<TResult[]><any>en).en();
active = en.getEnumerator();
}
e.current = active.current;
return true;
Expand All @@ -43,7 +47,7 @@ module exjs {
e.getEnumerator = () => selectEnumerator(<IEnumerable<T>>this, selector);
return e;
};
Enumerable.prototype.selectMany = function<T,TResult>(selector: (t: T) => IEnumerable<TResult>): IEnumerable<TResult> {
(<any>Enumerable.prototype).selectMany = function<T,TResult>(selector: (t: T) => any): IEnumerable<TResult> {
var e = new Enumerable<TResult>();
e.getEnumerator = () => selectManyEnumerator<T, TResult>(<IEnumerable<T>>this, selector);
return e;
Expand Down
9 changes: 9 additions & 0 deletions test/enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,15 @@ test("selectMany", () => {
strictEqual(res2[3], 4);
strictEqual(res2[4], 5);
strictEqual(res2[5], 6);

res2 = arr2.en().selectMany(t => t.i).toArray();
strictEqual(res2.length, 6);
strictEqual(res2[0], 1);
strictEqual(res2[1], 2);
strictEqual(res2[2], 3);
strictEqual(res2[3], 4);
strictEqual(res2[4], 5);
strictEqual(res2[5], 6);
});

test("skip", () => {
Expand Down

0 comments on commit 91338ca

Please sign in to comment.