1 | 'use strict'
|
2 |
|
3 | var BloomFilter = require('bloomfilter').BloomFilter
|
4 | var deepSort = require('./deepSort')
|
5 | var genKeys = require('./genKeys')
|
6 | var deepMatch = require('./deepMatch')
|
7 |
|
8 | function Bucket (isDeep) {
|
9 | this.filter = new BloomFilter(
|
10 | 32 * 256,
|
11 | 16
|
12 | )
|
13 | this.data = []
|
14 | this.isDeep = isDeep
|
15 | }
|
16 |
|
17 | Bucket.prototype.add = function (set) {
|
18 | genKeys(set.pattern).forEach(addPatterns, this)
|
19 | this.data.push(set)
|
20 | if (this.isDeep) {
|
21 | this.data.sort(deepSort)
|
22 | }
|
23 | return this
|
24 | }
|
25 |
|
26 | function addPatterns (toAdd) {
|
27 | this.filter.add(toAdd)
|
28 | }
|
29 |
|
30 | Bucket.prototype.remove = function (pattern, payload) {
|
31 | var foundPattern = false
|
32 | var data = this.data
|
33 |
|
34 | for (var i = 0; i < data.length; i++) {
|
35 | if (deepMatch(pattern, data[i].pattern)) {
|
36 | if (payload === null || payload === data[i].payload) {
|
37 | data.splice(i, 1)
|
38 | foundPattern = true
|
39 |
|
40 |
|
41 | this.remove(pattern, payload)
|
42 | break
|
43 | }
|
44 | }
|
45 | }
|
46 |
|
47 | return foundPattern
|
48 | }
|
49 |
|
50 | Bucket.prototype.forEach = function (func, that) {
|
51 | this.data.forEach(func, that)
|
52 | return this
|
53 | }
|
54 |
|
55 | module.exports = Bucket
|