and
создает новый редуктор, (r, x) => ...
, путем объединения двух (2) входных редукторов, f
и g
-
const and = (f, g) =>
(r, x) => g (f (r, x), x)
all
, используя and
, создает новый редуктор, комбинируя произвольное количество редукторов -
const identity = x =>
x
const all = (f = identity, ...more) =>
more .reduce (and, f)
Определите myReducer
, используя all
-
const myReducer =
all
( reactionDisabledReducer
, reactionIconReducer
, reactionOrderReducer
// ...
)
С учетом имитации реализации этих трех (3) редукторов -
const reactionDisabledReducer = (s, x) =>
x < 0
? { ...s, disabled: true }
: s
const reactionIconReducer = (s, x) =>
({ ...s, icon: `${x}.png` })
const reactionOrderReducer = (s, x) =>
x > 10
? { ...s, error: "over 10" }
: s
Запустите myReducer
, чтобы увидеть выходные данные
const initState =
{ foo: "bar" }
myReducer (initState, 10)
// { foo: 'bar', icon: '10.png' }
myReducer (initState, -1)
// { foo: 'bar', disabled: true, icon: '-1.png' }
myReducer (initState, 100)
// { foo: 'bar', icon: '100.png', error: 'over 10' }
Разверните фрагмент ниже, чтобы проверить результаты в своем браузере -
const identity = x =>
x
const and = (f, g) =>
(r, x) => g (f (r, x), x)
const all = (f, ...more) =>
more .reduce (and, f)
const reactionDisabledReducer = (s, x) =>
x < 0
? { ...s, disabled: true }
: s
const reactionIconReducer = (s, x) =>
({ ...s, icon: `${x}.png` })
const reactionOrderReducer = (s, x) =>
x > 10
? { ...s, error: "over 10" }
: s
const myReducer =
all
( reactionDisabledReducer
, reactionIconReducer
, reactionOrderReducer
// ...
)
const initState =
{ foo: "bar" }
console .log (myReducer (initState, 10))
// { foo: 'bar', icon: '10.png' }
console .log (myReducer (initState, -1))
// { foo: 'bar', disabled: true, icon: '-1.png' }
console .log (myReducer (initState, 100))
// { foo: 'bar', icon: '100.png', error: 'over 10' }
Вы можете выбрать любые имена, которые вам нравятся для and
и all
. Я мог видеть их как часть reducer
модуля, как reducer.and
и reducer.all