diff --git a/Definitions/linq-2.2.0.2.d.ts b/Definitions/linq-2.2.0.2.d.ts new file mode 100644 index 000000000..0cf528287 --- /dev/null +++ b/Definitions/linq-2.2.0.2.d.ts @@ -0,0 +1,220 @@ +// http://linqjs.codeplex.com/ +// 2.2.0.2 + +// todo: jQuery plugin, RxJS Binding + +module linq { + + interface EnumerableStatic { + Choice(...contents: any[]): Enumerable; + Choice(contents: any[]): Enumerable; + Cycle(...contents: any[]): Enumerable; + Cycle(contents: any[]): Enumerable; + Empty(): Enumerable; + From(obj: any[]): Enumerable; + From(obj: any): Enumerable; + Return(element: any): Enumerable; + Matches(input: string, pattern: RegExp): Enumerable; + Matches(input: string, pattern: string, flags?: string): Enumerable; + Range(start: number, count: number, step?: number): Enumerable; + RangeDown(start: number, count: number, step?: number): Enumerable; + RangeTo(start: number, to: number, step?: number): Enumerable; + Repeat(obj: any, count?: number): Enumerable; + RepeatWithFinalize(initializer: () => any, finalizer: (resource: any) =>void ): Enumerable; + Generate(func: () => any, count?: number): Enumerable; + Generate(func: string, count?: number): Enumerable; + ToInfinity(start?: number, step?: number): Enumerable; + ToNegativeInfinity(start?: number, step?: number): Enumerable; + Unfold(seed, func: ($) => any): Enumerable; + Unfold(seed, func: string): Enumerable; + } + + interface Enumerable { + //Projection and Filtering Methods + CascadeBreadthFirst(func: ($) => any[], resultSelector: (v, i: number) => any): Enumerable; + CascadeBreadthFirst(func: string, resultSelector: string): Enumerable; + CascadeDepthFirst(func: ($) => any[], resultSelector: (v, i: number) => any): Enumerable; + CascadeDepthFirst(func: string, resultSelector: string): Enumerable; + Flatten(...items: any[]): Enumerable; + Pairwise(selector: (prev, next) => any): Enumerable; + Pairwise(selector: string): Enumerable; + Scan(func: (a, b) => any): Enumerable; + Scan(func: string): Enumerable; + Scan(seed, func: (a, b) => any, resultSelector?: ($) => any): Enumerable; + Scan(seed, func: string, resultSelector?: string): Enumerable; + Select(selector: ($, i: number) => any): Enumerable; + Select(selector: string): Enumerable; + SelectMany(collectionSelector: ($, i: number) => any[], resultSelector?: ($, item) => any): Enumerable; + SelectMany(collectionSelector: ($, i: number) => Enumerable, resultSelector?: ($, item) => any): Enumerable; + SelectMany(collectionSelector: string, resultSelector?: string): Enumerable; + Where(predicate: ($, i: number) => bool): Enumerable; + Where(predicate: string): Enumerable; + OfType(type: Function): Enumerable; + Zip(second: any[], selector: (v1, v2, i: number) => any): Enumerable; + Zip(second: any[], selector: string): Enumerable; + Zip(second: Enumerable, selector: (v1, v2, i: number) => any): Enumerable; + Zip(second: Enumerable, selector: string): Enumerable; + //Join Methods + Join(inner: any[], outerKeySelector: (v1) => any, innerKeySelector: (v1) => any, resultSelector: (v1, v2) => any, compareSelector?: (v) => any): Enumerable; + Join(inner: any[], outerKeySelector: string, innerKeySelector: string, resultSelector: string, compareSelector?: string): Enumerable; + Join(inner: Enumerable, outerKeySelector: (v1) => any, innerKeySelector: (v1) => any, resultSelector: (v1, v2) => any, compareSelector?: (v) => any): Enumerable; + Join(inner: Enumerable, outerKeySelector: string, innerKeySelector: string, resultSelector: string, compareSelector?: string): Enumerable; + GroupJoin(inner: any[], outerKeySelector: (v1) => any, innerKeySelector: (v1) => any, resultSelector: (v1, v2: Enumerable) => any, compareSelector?: (v) => any): Enumerable; + GroupJoin(inner: any[], outerKeySelector: string, innerKeySelector: string, resultSelector: string, compareSelector?: string): Enumerable; + GroupJoin(inner: Enumerable, outerKeySelector: (v1) => any, innerKeySelector: (v1) => any, resultSelector: (v1, v2: Enumerable) => any, compareSelector?: (v) => any): Enumerable; + GroupJoin(inner: Enumerable, outerKeySelector: string, innerKeySelector: string, resultSelector: string, compareSelector?: string): Enumerable; + //Set Methods + All(predicate: ($) => bool): bool; + All(predicate: string): bool; + Any(predicate?: ($) => bool): bool; + Any(predicate?: string): bool; + Concat(second: any[]): Enumerable; + Concat(second: Enumerable): Enumerable; + Insert(index: number, second: any[]): Enumerable; + Insert(index: number, second: Enumerable): Enumerable; + Alternate(value): Enumerable; + Contains(value, compareSelector?: ($) => any): bool; + Contains(value, compareSelector?: string): bool; + DefaultIfEmpty(defaultValue): Enumerable; + Distinct(compareSelector?: ($) => any): Enumerable; + Distinct(compareSelector?: string): Enumerable; + Except(second: any[], compareSelector?: ($) => any): Enumerable; + Except(second: any[], compareSelector?: string): Enumerable; + Except(second: Enumerable, compareSelector?: ($) => any): Enumerable; + Except(second: Enumerable, compareSelector?: string): Enumerable; + Intersect(second: any[], compareSelector?: ($) => any): Enumerable; + Intersect(second: any[], compareSelector?: string): Enumerable; + Intersect(second: Enumerable, compareSelector?: ($) => any): Enumerable; + Intersect(second: Enumerable, compareSelector?: string): Enumerable; + SequenceEqual(second: any[], compareSelector?: ($) => any): bool; + SequenceEqual(second: any[], compareSelector?: string): bool; + SequenceEqual(second: Enumerable, compareSelector?: ($) => any): bool; + SequenceEqual(second: Enumerable, compareSelector?: string): bool; + Union(second: any[], compareSelector?: ($) => any): Enumerable; + Union(second: any[], compareSelector?: string): Enumerable; + Union(second: Enumerable, compareSelector?: ($) => any): Enumerable; + Union(second: Enumerable, compareSelector?: string): Enumerable; + //Ordering Methods + OrderBy(keySelector?: ($) => any): OrderedEnumerable; + OrderBy(keySelector?: string): OrderedEnumerable; + OrderByDescending(keySelector?: ($) => any): OrderedEnumerable; + OrderByDescending(keySelector?: string): OrderedEnumerable; + Reverse(): Enumerable; + Shuffle(): Enumerable; + //Grouping Methods + GroupBy(keySelector: ($) => any, elementSelector?: ($) => any, resultSelector?: (key, e) => any, compareSelector?: ($) =>any): Enumerable; + GroupBy(keySelector: string, elementSelector?: string, resultSelector?: string, compareSelector?: string): Enumerable; + PartitionBy(keySelector: ($) => any, elementSelector?: ($) => any, resultSelector?: (key, e) => any, compareSelector?: ($) =>any): Enumerable; + PartitionBy(keySelector: string, elementSelector?: string, resultSelector?: string, compareSelector?: string): Enumerable; + BufferWithCount(count: number): Enumerable; + // Aggregate Methods + Aggregate(func: (a, b) => any); + Aggregate(seed, func: (a, b) => any, resultSelector?: ($) => any); + Aggregate(func: string); + Aggregate(seed, func: string, resultSelector?: string); + Average(selector?: ($) => number): number; + Average(selector?: string): number; + Count(predicate?: ($) => bool): number; + Count(predicate?: string): number; + Max(selector?: ($) => number): number; + Max(selector?: string): number; + Min(selector?: ($) => number): number; + Min(selector?: string): number; + MaxBy(selector: ($) => number): any; + MaxBy(selector: string): any; + MinBy(selector: ($) => number): any; + MinBy(selector: string): any; + Sum(selector?: ($) => number): number; + Sum(selector?: string): number; + //Paging Methods + ElementAt(index: number): any; + ElementAtOrDefault(index: number, defaultValue): any; + First(predicate?: ($) => bool): any; + First(predicate?: string): any; + FirstOrDefault(defaultValue, predicate?: ($) => bool): any; + FirstOrDefault(defaultValue, predicate?: string): any; + Last(predicate?: ($) => bool): any; + Last(predicate?: string): any; + LastOrDefault(defaultValue, predicate?: ($) => bool): any; + LastOrDefault(defaultValue, predicate?: string): any; + Single(predicate?: ($) => bool): any; + Single(predicate?: string): any; + SingleOrDefault(defaultValue, predicate?: ($) => bool): any; + SingleOrDefault(defaultValue, predicate?: string): any; + Skip(count: number): Enumerable; + SkipWhile(predicate: ($, i: number) => bool): Enumerable; + SkipWhile(predicate: string): Enumerable; + Take(count: number): Enumerable; + TakeWhile(predicate: ($, i: number) => bool): Enumerable; + TakeWhile(predicate: string): Enumerable; + TakeExceptLast(count?: number): Enumerable; + TakeFromLast(count: number): Enumerable; + IndexOf(item): number; + LastIndexOf(item): number; + // Convert Methods + ToArray(): any[]; + ToLookup(keySelector: ($) => any, elementSelector?: ($) => any, compareSelector?: (key) => any): Lookup; + ToLookup(keySelector: string, elementSelector?: string, compareSelector?: string): Lookup; + ToObject(keySelector: ($) => string, elementSelector: ($) => any): any; + ToObject(keySelector: string, elementSelector: string): any; + ToDictionary(keySelector: ($) => any, elementSelector: ($) => any, compareSelector?: (key) => any): Dictionary; + ToDictionary(keySelector: string, elementSelector: string, compareSelector?: string): Dictionary; + ToJSON(replacer?: (key, value) => any, space?: number): string; + ToJSON(replacer?: string, space?: number): string; + ToString(separator?: string, selector?: ($) =>any): string; + ToString(separator?: string, selector?: string): string; + //Action Methods + Do(action: ($, i: number) => void ): Enumerable; + Do(action: string): Enumerable; + ForEach(action: ($, i: number) => void ): void; + ForEach(func: ($, i: number) => bool): void; + ForEach(action_func: string): void; + Write(separator?: string, selector?: ($) =>any): void; + Write(separator?: string, selector?: string): void; + WriteLine(selector?: ($) =>any): void; + Force(): void; + //Functional Methods + Let(func: (e: Enumerable) => Enumerable): Enumerable; + Share(): Enumerable; + MemoizeAll(): Enumerable; + //Error Handling Methods + Catch(handler: (error: Error) => void ): Enumerable; + Catch(handler: string): Enumerable; + Finally(finallyAction: () => void ): Enumerable; + Finally(finallyAction: string): Enumerable; + //For Debug Methods + Trace(message?: string, selector?: ($) =>any): Enumerable; + Trace(message?: string, selector?: string): Enumerable; + } + + interface OrderedEnumerable extends Enumerable { + ThenBy(keySelector: ($) => any): OrderedEnumerable; + ThenBy(keySelector: string): OrderedEnumerable; + ThenByDescending(keySelector: ($) => any): OrderedEnumerable; + ThenByDescending(keySelector: string): OrderedEnumerable; + } + + interface Grouping extends Enumerable { + Key(); + } + + interface Lookup { + Count(): number; + Get(key): Enumerable; + Contains(key): bool; + ToEnumerable(): Enumerable; + } + + interface Dictionary { + Add(key, value): void; + Get(key): any; + Set(key, value): bool; + Contains(key): bool; + Clear(): void; + Remove(key): void; + Count(): number; + ToEnumerable(): Enumerable; + } +} + +declare var Enumerable: linq.EnumerableStatic; \ No newline at end of file diff --git a/Tests/linq-tests.ts b/Tests/linq-tests.ts new file mode 100644 index 000000000..56e36fdab --- /dev/null +++ b/Tests/linq-tests.ts @@ -0,0 +1,39 @@ +/// +/// +// tests were run from VisualStudio + Resharper7 + +describe("Linq.js tests", function () { + it("Projection and Filtering Methods", function () { + expect(Enumerable.From([1,2,3,4]).ToString(",")).toBe("1,2,3,4"); + expect(Enumerable.Range(1, 4).Where((item: number) => item > 2).ToString(",")).toBe("3,4"); + expect(Enumerable.Range(1, 4).Where("(item) => item > 2").ToString(",")).toBe("3,4"); + expect(Enumerable.Range(1, 4).Where("$>2").ToString(",")).toBe("3,4"); + expect(Enumerable.Range(1, 4).Select((item: number,index:number) => item+index).ToString(",")).toBe("1,3,5,7"); + expect(Enumerable.Range(1, 4).Zip(Enumerable.Range(1, 10), (a: number,b:number) => a-b).ToString(",")).toBe("0,0,0,0"); + + }); + it("Join Methods", function () { + expect(Enumerable.Range(1, 4).Join(Enumerable.From(["a", "aaa"]), (l) => l, (r: string) => r.length, (l, r) =>l + ":" + r).ToString(",")).toBe("1:a,3:aaa"); + }); + it("Set Methods", function () { + expect(Enumerable.Range(2, 4, 2).All((item: number) => item % 2 == 0)).toBe(true); + expect(Enumerable.Range(1, 4).Intersect(Enumerable.Range(3, 4)).ToString(",")).toBe("3,4"); + }); + it("Ordering Methods", function () { + expect(Enumerable.From( + [ + { name: "marcin", age:15}, + { name: "albert", age:51}, + { name: "marcin", age:30}, + ]).OrderBy((p) => p.name).ThenByDescending((p) => p.age).Select((p) => p.name+p.age).ToString(",")).toBe("albert51,marcin30,marcin15"); + }); + it("Grouping Methods", function () { + expect(Enumerable.From(["a","aa","aaa","a","a","aaa"]) + .GroupBy((item:string) => item.length) + .Select((g: linq.Grouping) => { return { key: g.Key(), count: g.Count() }; }) + .OrderBy(g => g.key) + .Select(g => g.key+":"+g.count) + .ToString(",")).toBe("1:3,2:1,3:2"); + }); +}); +