Skip to content

Instantly share code, notes, and snippets.

@dankreiger
Last active October 24, 2022 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dankreiger/e6fc0db23bf349ed60f4eb9d4c4c1694 to your computer and use it in GitHub Desktop.
Save dankreiger/e6fc0db23bf349ed60f4eb9d4c4c1694 to your computer and use it in GitHub Desktop.
higher order reducers
// types
type T_XF<XF_Before, XF_After> = (a: XF_Before) => XF_After;
type T_Pred<Pred_Fn> = (fn: Pred_Fn) => boolean;
type T_Reducer<Before, After> = (acc: After, cur: Before) => After;
type T_Hor<Inner_Before, Before, After> = (
reducer: T_Reducer<Before, After>
) => T_Reducer<Inner_Before, After>;
type T_Map = <Before, After, Inner_Before = Before>(
xf: T_XF<Inner_Before, Before>
) => T_Hor<Inner_Before, Before, After>;
type T_Filter = <Before, After>(
pred: T_Pred<Before>
) => T_Hor<Before, Before, After>;
const map: T_Map = (xf) => (reducer) => (acc, cur) => reducer(acc, xf(cur));
const filter: T_Filter = (pred) => (reducer) => (acc, cur) => pred(cur) ? reducer(acc, cur) : acc;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment