import {intersection, union, subtract, flow, cond, isNot, empty} from 'tsfun'; export interface ResultSets { addSets: Array>, subtractSets: Array>, } /** * @author Daniel de Oliveira * @author Thomas Kleinke */ export module ResultSets { export function make(): ResultSets { return { addSets: [], subtractSets: [] } as ResultSets; } export function isEmpty(resultSets: ResultSets): boolean { return resultSets.addSets.length === 0 && resultSets.subtractSets.length === 0; } export function containsOnlyEmptyAddSets(resultSets: ResultSets): boolean { if (resultSets.addSets.length === 0) return false; return !resultSets.addSets .some(addSet => addSet.length > 0); } export function combine(resultSets: ResultSets, items: Array, subtract: undefined|true = undefined): void { (!subtract ? resultSets.addSets : resultSets.subtractSets) .push(items); } export function collapse(resultSets: ResultSets): Array { return flow( intersection(resultSets.addSets), cond( isNot(empty)(resultSets.subtractSets), subtract(union(resultSets.subtractSets)))); } export function unifyAddSets(resultSets: ResultSets): Array { return union(resultSets.addSets); } }