Skip to content

Instantly share code, notes, and snippets.

View gtkatakura's full-sized avatar

gtkatakura

View GitHub Profile
@gtkatakura
gtkatakura / reducers.ts
Last active May 7, 2018 00:51
TypeScript + Reducers
type ThemeColor = string;
type Theme = { id: number, color: ThemeColor }
type State = { themes?: [Theme] }
type ExtractFirstArgument<T> =
T extends (T1: infer T1) => infer R
? (T extends (t1: infer T1, t2: infer T2, t3: infer T3) => infer R
? Extract<T2, undefined> extends never
? () => R
: (Extract<T3, undefined> extends never
const defaultMiddleware = next => (...args) => next(...args)
const compose = (() => {
const base = (f, g) => (...args) => f(g(...args));
return (...funcs) => funcs.reduce(base)
})();
const applyMiddlewares = (middlewares, func) => compose(...middlewares)(func);
const recursive = (func, middlewares = [defaultMiddleware]) => {
{
const flatten = array => [].concat(...array)
const uniq = array => array.reduce((filtered, element) => (
filtered.includes(element)
? filtered
: [...filtered, element]
), [])
const normalize = array => uniq(flatten(array)).sort()
type TypesDefinition =
| StringConstructor
| BooleanConstructor
| DateConstructor
type FieldDefinition = {
type: TypesDefinition,
required?: boolean,
default?: boolean,
}