Reverseパターン

非純粋関数を合成可能な擬似純粋関数にするデザインパターン。非純粋関数の返り値を逆操作関数にすることで疑似純粋化し逆操作関数を無引数無返り値に統一することで合成可能化する。操作は逆操作により副作用を残さず中止および終了され複数の操作はArrow演算により単一の操作に合成される。

function proc(): () => void {
  return aggregate(
    bind(el, type, listener),
    bind(el, type, listener));
}

function bind(el, type, listener): () => void {
  el.addEventListener(type, listener);
  return () => el.removeEventListener(type, listener);
}

function aggregate(...as: (b => c)[]): b => c[] {
  return b => as.map(f => f(b));
}

https://github.com/falsandtru/spica/blob/master/src/arrow.test.ts