map-transform
Version:
Map and transform objects with mapping definitions
34 lines • 1.59 kB
JavaScript
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