UNPKG

map-transform

Version:

Map and transform objects with mapping definitions

34 lines 1.59 kB
import pipe from './pipe.js'; import { setValueFromState, popContext, isNonvalueState, setStateValue, markAsUntouched, isUntouched, } from '../utils/stateHelpers.js'; import { defToOperations } from '../utils/definitionHelpers.js'; import { noopNext } from '../utils/stateHelpers.js'; const pipeIfArray = (def) => Array.isArray(def) ? pipe(def, true) : def; async function runAltPipeline(pipeline, state) { const afterState = await pipeline(markAsUntouched(state)); return isUntouched(afterState) ? setStateValue(afterState, undefined) : afterState; } function createOneAltPipeline(def, index, hasOnlyOneAlt) { return (options) => { const pipeline = pipeIfArray(defToOperations(def, options))(options)(noopNext); const isFirst = !hasOnlyOneAlt && index === 0; const { nonvalues } = options; return (next) => async (state) => { const nextState = await next(state); if (!isFirst && !isNonvalueState(nextState, nonvalues)) { return nextState; } const beforeState = isFirst ? nextState : popContext(nextState); const afterState = await runAltPipeline(pipeline, beforeState); return isNonvalueState(afterState, nonvalues) ? setValueFromState(nextState, afterState, isFirst) : afterState; }; }; } export default function alt(...defs) { const hasOnlyOneAlt = defs.length === 1; return defs.map((def, index) => createOneAltPipeline(def, index, hasOnlyOneAlt)); } //# sourceMappingURL=alt.js.map