type WhereOperator = '&' | '>' | '>=' | '<' | '<=' | '!=' | '<=>' | '%' | '|' | '!' | '~' | '=' | '^' type AssociatedSearchItem = { key: any, item: any } type WhereResult = any[] // bitwise and // greater than // greater than equal // less than // less than equal // not equal // null-safe equal // modulo // bitwise or // not // bitwise negation // equal const whereMatch = (item: AssociatedSearchItem, operator: WhereOperator, operand?: any): boolean => { switch ( operator ) { case '&': if ( item.key & operand ) return true break case '>': if ( item.key > operand ) return true break case '>=': if ( item.key >= operand ) return true break case '<': if ( item.key < operand ) return true break case '<=': if ( item.key <= operand ) return true break case '!=': if ( item.key !== operand ) return true break case '<=>': if ( item.key === operand && typeof item.key !== 'undefined' && item.key !== null ) return true break case '%': if ( item.key % operand ) return true break case '|': if ( item.key | operand ) return true break case '!': if ( !item.key ) return true break case '~': if ( ~item.key ) return true break case '=': if ( item.key === operand ) return true break case '^': if ( item.key ^ operand ) return true break } return false } const applyWhere = (items: AssociatedSearchItem[], operator: WhereOperator, operand?: any): WhereResult => { const matches: WhereResult = [] for ( const item of items ) { if ( whereMatch(item, operator, operand) ) matches.push(item.item) } return matches } export { WhereOperator, WhereResult, AssociatedSearchItem, applyWhere, whereMatch }