Skip to content

Commit

Permalink
refactor(transducers): extract common logic for add/mul/sub reducers
Browse files Browse the repository at this point in the history
  • Loading branch information
postspectacular committed Aug 18, 2019
1 parent 8dba93a commit 7caa71a
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 22 deletions.
11 changes: 3 additions & 8 deletions packages/transducers/src/rfn/add.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import { Reducer } from "../api";
import { $$reduce, reducer } from "../reduce";
import { __mathop } from "./mathop";

/**
* Reducer to compute sum of values with given `init` value.
* Reducer to compute sum of values with given `init` value. Default: 0
*/
export function add(init?: number): Reducer<number, number>;
export function add(xs: Iterable<number>): number;
export function add(init: number, xs: Iterable<number>): number;
export function add(...args: any[]): any {
const res = $$reduce(add, args);
if (res !== undefined) {
return res;
}
const init = args[0] || 0;
return reducer(() => init, (acc, x: number) => acc + x);
return __mathop(add, (acc, x: number) => acc + x, 0, args);
}
17 changes: 17 additions & 0 deletions packages/transducers/src/rfn/mathop.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { FnAny } from "@thi.ng/api";
import { Reducer, ReductionFn } from "../api";
import { $$reduce, reducer } from "../reduce";

export const __mathop = (
rfn: FnAny<Reducer<number, number>>,
fn: ReductionFn<number, number>,
initDefault: number,
args: any[]
) => {
const res = $$reduce(rfn, args);
if (res !== undefined) {
return res;
}
const init = args[0] || initDefault;
return reducer(() => init, fn);
};
9 changes: 2 additions & 7 deletions packages/transducers/src/rfn/mul.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Reducer } from "../api";
import { $$reduce, reducer } from "../reduce";
import { __mathop } from "./mathop";

/**
* Reducer to compute product of values with optional `init` value
Expand All @@ -9,10 +9,5 @@ export function mul(init?: number): Reducer<number, number>;
export function mul(xs: Iterable<number>): number;
export function mul(init: number, xs: Iterable<number>): number;
export function mul(...args: any[]): any {
const res = $$reduce(mul, args);
if (res !== undefined) {
return res;
}
const init = args[0] || 1;
return reducer(() => init, (acc, x: number) => acc * x);
return __mathop(mul, (acc, x: number) => acc * x, 1, args);
}
9 changes: 2 additions & 7 deletions packages/transducers/src/rfn/sub.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Reducer } from "../api";
import { $$reduce, reducer } from "../reduce";
import { __mathop } from "./mathop";

/**
* Reducer to successively subtract values from optional `init` value
Expand All @@ -9,10 +9,5 @@ export function sub(init?: number): Reducer<number, number>;
export function sub(xs: Iterable<number>): number;
export function sub(init: number, xs: Iterable<number>): number;
export function sub(...args: any[]): any {
const res = $$reduce(sub, args);
if (res !== undefined) {
return res;
}
const init = args[0] || 0;
return reducer(() => init, (acc, x: number) => acc - x);
return __mathop(sub, (acc, x: number) => acc - x, 0, args);
}

0 comments on commit 7caa71a

Please sign in to comment.