You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.0 KiB
76 lines
2.0 KiB
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 }
|