interface UpdateMediatorFunction { (value: Val, ...extraArgs: UpdateArgs): Val } interface UpdateFunction { (key: Key, ...extraArgs: UpdateArgs): Val } export default function updateKeyVal( get: (key: Key) => Val, set: (key: Key, val: Val) => Val, updateFn: UpdateMediatorFunction, defaultValue: Val ): UpdateFunction { return (key: Key, ...extraArgs: UpdateArgs) => { const val = updateFn(get(key) || defaultValue, ...extraArgs) set(key, val) return val } }