switch-functional
Version:
Functional switch statement
98 lines (55 loc) • 1.08 kB
JavaScript
export const matchesConditions=(
input,
conditions,
options)=>
Array.isArray(conditions)?
conditions.some((condition)=>
matchesCondition(
input,
condition,
options
)
):
matchesCondition(
input,
conditions,
options
);
const matchesCondition=(
input,
condition,
{
mapCondition
})=>
{
const normalizedCondition=
mapCondition===undefined?
condition:
mapCondition(condition);
if(typeof normalizedCondition==="function"){
return normalizedCondition(input)
}
if(typeof normalizedCondition==="boolean"){
return normalizedCondition
}
return deepIncludes(input,normalizedCondition)
};
const deepIncludes=(input,subset)=>{
if(
!isObject(input)||
!isObject(subset)||
Array.isArray(input)!==Array.isArray(subset))
{
return Object.is(input,subset)
}
if(Array.isArray(input)&&Array.isArray(subset)){
return(
subset.length===input.length&&
subset.every((item,index)=>deepIncludes(input[index],item)))
}
return Object.entries(subset).every(([name,child])=>
deepIncludes(input[name],child)
)
};
const isObject=(input)=>
typeof input==="object"&&input!==null;