All files Operations.ts

100% Statements 37/37
100% Branches 10/10
100% Functions 23/23
100% Lines 34/34
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98      1x   67x       4002x           1x   67x       4003x           3501x 7002x       3x 2x 1x   1x   35x 70x         500x         5x 3x 1x   2x   68x 136x         2001x         3x 2x 1x   1x   35x 70x         1000x           2x   70x 6x   64x       1001x        
import { HierarchicalBitset } from "./BitSet";
 
export function one(size: number): HierarchicalBitset {
  return {
    byte(index: number, layer: number): number {
      return ~0;
    },
 
    size(): number {
      return size;
    }
  }
}
 
export function zero(size: number): HierarchicalBitset {
  return {
    byte(index: number, layer: number): number {
      return 0;
    },
 
    size(): number {
      return size;
    }
  }
}
 
function maximumSize(sets: Array<HierarchicalBitset>): number {
  return sets.reduce((acc, set) => {
    return acc >= set.size() ? acc : set.size();
  }, 0); 
}
 
export function and(...sets: Array<HierarchicalBitset>): HierarchicalBitset {
  if (sets.length == 1) {
    return sets[0];
  }
  return {
      byte(index: number, layer: number): number {
        return sets.reduce((acc, set) => {
          return acc & set.byte(index, layer);
        }, ~0);
      },
 
      size(): number {
        return maximumSize(sets)
      }
  }
}
 
export function xor(...sets: Array<HierarchicalBitset>): HierarchicalBitset {
  if (sets.length == 1) {
    return sets[0];
  }
  return {
      byte(index: number, layer: number): number {
        return sets.reduce((acc, set) => {
          return acc ^ set.byte(index, layer);
        }, 0);
      },
 
      size(): number {
        return maximumSize(sets)
      }
  }
}
 
export function or(...sets: Array<HierarchicalBitset>): HierarchicalBitset {
  if (sets.length == 1) {
    return sets[0];
  }
  return {
      byte(index: number, layer: number): number {
        return sets.reduce((acc, set) => {
          return acc | set.byte(index, layer);
        }, 0);
      },
 
      size(): number {
        return maximumSize(sets)
      }
  }
}
 
export function not(a: HierarchicalBitset): HierarchicalBitset {
  return {
      byte(index: number, layer: number): number {
        if(layer != 0) {
          return ~0;
        }
        return ~a.byte(index, layer);
      },
 
      size(): number {
        return a.size();
      }
  }
}