Skip to content

Commit

Permalink
Experiment with pipe
Browse files Browse the repository at this point in the history
  • Loading branch information
Jason3S committed Sep 22, 2018
1 parent addef2c commit 68c0f1e
Show file tree
Hide file tree
Showing 9 changed files with 1,662 additions and 2,398 deletions.
3,458 changes: 1,133 additions & 2,325 deletions package-lock.json

Large diffs are not rendered by default.

18 changes: 10 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
"typings": "lib/index.d.ts",
"dependencies": {},
"devDependencies": {
"@types/chai": "^4.1.3",
"@types/mocha": "^5.2.0",
"@types/node": "^7.0.61",
"@types/chai": "^4.1.5",
"@types/mocha": "^5.2.5",
"@types/node": "^8.10.30",
"@types/tape": "^4.2.32",
"chai": "^4.1.2",
"coveralls": "^3.0.0",
"mocha": "^5.1.1",
"nyc": "^11.7.1",
"coveralls": "^3.0.2",
"mocha": "^5.2.0",
"nyc": "^13.0.1",
"rimraf": "^2.6.2",
"ts-node": "^6.0.1",
"typescript": "^2.8.3"
"tape": "^4.9.1",
"ts-node": "^7.0.1",
"typescript": "^3.0.3"
},
"scripts": {
"prepublish": "npm run clean-build && npm test",
Expand Down
14 changes: 1 addition & 13 deletions src/GenSequence.perf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@ describe('Performance Test', function(this: ISuiteCallbackContext) {
}
const rBase = measure(fnBase, 100);
const rExp = measure(fnExp, 100);
const ratio = rExp.avg / rBase.avg;

expect(rExp.result).to.deep.equal(rBase.result);
console.log('Simple Generator to an array' + compareMeasurementsToString(rBase, rExp));
expect(ratio).to.be.lessThan(1.2);
});

it('filter filter reduce', () => {
Expand All @@ -38,11 +36,9 @@ describe('Performance Test', function(this: ISuiteCallbackContext) {
}
const rBase = measure(fnBase, 10);
const rExp = measure(fnExp, 10);
const ratio = rExp.avg / rBase.avg;

expect(rExp.result).to.equal(rBase.result);
console.log('filter filter reduce' + compareMeasurementsToString(rBase, rExp));
expect(ratio).to.be.lessThan(1.4);
});

it('filter slice filter reduce', () => {
Expand All @@ -66,11 +62,9 @@ describe('Performance Test', function(this: ISuiteCallbackContext) {
}
const rBase = measure(fnBase, 10);
const rExp = measure(fnExp, 10);
const ratio = rExp.avg / rBase.avg;

expect(rExp.result).to.equal(rBase.result);
console.log('filter slice filter reduce' + compareMeasurementsToString(rBase, rExp));
expect(ratio).to.be.lessThan(1);
});

it('filter slice filter reduce (1000)', () => {
Expand All @@ -94,15 +88,13 @@ describe('Performance Test', function(this: ISuiteCallbackContext) {
}
const rBase = measure(fnBase, 1000);
const rExp = measure(fnExp, 1000);
const ratio = rExp.avg / rBase.avg;

expect(rExp.result).to.equal(rBase.result);
console.log('filter slice filter reduce (1000)' + compareMeasurementsToString(rBase, rExp));
expect(ratio).to.be.lessThan(2);
});

it('filter slice filter first (1000)', () => {
const getValues = () => range(0, 1000);
const getValues = () => range(0, 2000);
const fnBase = () => {
return [...getValues()]
.filter(a => !!(a & 1))
Expand All @@ -124,11 +116,9 @@ describe('Performance Test', function(this: ISuiteCallbackContext) {
}
const rBase = measure(fnBase, 1000);
const rExp = measure(fnExp, 1000);
const ratio = rExp.avg / rBase.avg;

expect(rExp.result).to.equal(rBase.result);
console.log('filter slice filter first (1000)' + compareMeasurementsToString(rBase, rExp));
expect(ratio).to.be.lessThan(3);
});

it('concatMap', () => {
Expand Down Expand Up @@ -158,11 +148,9 @@ describe('Performance Test', function(this: ISuiteCallbackContext) {
}
const rBase = measure(fnBase, 100);
const rExp = measure(fnExp, 100);
const ratio = rExp.avg / rBase.avg;

expect(rExp.result).to.equal(rBase.result);
console.log('concatMap' + compareMeasurementsToString(rBase, rExp));
expect(ratio).to.be.lessThan(2);
});
});

Expand Down
66 changes: 14 additions & 52 deletions src/GenSequence.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
export * from './types';

export type Maybe<T> = T | undefined;

export interface IterableLike<T> {
[Symbol.iterator](): Iterator<T> | IterableIterator<T>;
}
import {IterableLike, Maybe} from './types';
import * as iop from './internal/operators';

export interface Sequence<T> extends IterableLike<T> {
next(): IteratorResult<T>;
Expand Down Expand Up @@ -160,53 +158,29 @@ export const GenSequence = {
};

//// Filters
export function* filter<T>(fnFilter: (t: T) => boolean, i: Iterable<T>) {
for (const v of i) {
if (fnFilter(v)) {
yield v;
}
}
export function filter<T>(fnFilter: (t: T) => boolean, i: Iterable<T>) {
return iop.filter(i, fnFilter);
}

export function* skip<T>(n: number, i: Iterable<T>): IterableIterator<T> {
let a = 0;
for (const t of i) {
if (a >= n) {
yield t;
}
a += 1;
}
export function skip<T>(n: number, i: Iterable<T>): IterableIterator<T> {
return iop.skip(i, n);
}


export function* take<T>(n: number, i: Iterable<T>): IterableIterator<T> {
let a = 0;
if (n) {
for (const t of i) {
if (a >= n) {
break;
}
yield t;
a += 1;
}
}
export function take<T>(n: number, i: Iterable<T>): IterableIterator<T> {
return iop.take(i, n);
}

//// Extenders
/**
* Concat two iterables together
*/
export function* concat<T>(i: Iterable<T>, j: Iterable<T>): IterableIterator<T> {
yield *i;
yield *j;
export function concat<T>(i: Iterable<T>, j: Iterable<T>): IterableIterator<T> {
return iop.concat(i, j);
}

export function* concatMap<T, U>(fn: (t: T) => Iterable<U>, i: Iterable<T>): IterableIterator<U> {
for (const t of i) {
for (const u of fn(t)) {
yield u;
}
}
export function concatMap<T, U>(fn: (t: T) => Iterable<U>, i: Iterable<T>): IterableIterator<U> {
return iop.concatMap(i, fn);
}

//// Mappers
Expand Down Expand Up @@ -321,19 +295,7 @@ export function reduce<T, U>(fnReduce: (prevValue: U, curValue: T, curIndex: num
export function reduce<T>(fnReduce: (prevValue: T, curValue: T, curIndex: number) => T, initialValue: T, i: Iterable<T>): T;
export function reduce<T>(fnReduce: (prevValue: T, curValue: T, curIndex: number) => T, initialValue: Maybe<T>, i: Iterable<T>): Maybe<T>;
export function reduce<T>(fnReduce: (prevValue: T, curValue: T, curIndex: number) => T, initialValue: Maybe<T>, i: Iterable<T>): Maybe<T> {
let index = 0;
if (initialValue === undefined) {
index = 1;
const r = i[Symbol.iterator]().next();
initialValue = r.value;
}
let prevValue = initialValue;
for (const t of i) {
const nextValue = fnReduce(prevValue, t, index);
prevValue = nextValue;
index += 1;
}
return prevValue;
return iop.reduce(i, fnReduce, initialValue);
}

//// Cast
Expand Down
Loading

0 comments on commit 68c0f1e

Please sign in to comment.