Skip to content

Instantly share code, notes, and snippets.

@didicodethat
Created March 31, 2017 19:48
Show Gist options
  • Save didicodethat/462cc00ea28dd8fd4deb05363f8b1235 to your computer and use it in GitHub Desktop.
Save didicodethat/462cc00ea28dd8fd4deb05363f8b1235 to your computer and use it in GitHub Desktop.
const repl = require('repl')
const readline = require('readline')
const nil = {_active: false, _nil: true}
// Helper Functions
const callOnEachKey = (object, method_name, ...args) => {
for(let key in object){
object[key][method_name](...args)
}
}
const filterFactory = (name, fn) => () => {
let self = {}
self.name = name
self.cache = []
self.original = []
self.needsUpdate = true
self.proccess = () => {
if (self.needsUpdate) {
self.cache = self.original.filter(fn)
self.needsUpdate = false
}
return self.cache
}
self.setOriginal = (raw) => {
self.original = raw
self.needsUpdate = true
self.proccess()
}
return self
}
const filterInactive = filterFactory('filterInactive', (item) => !item._active)
// Table related
const table = (name, factory, recicle) => {
let items = []
let filters = {}
let table = {}
const updateFilters = () => {
callOnEachKey(filters, 'setOriginal', items)
}
const _new = (...args) => {
let cached = filters.filterInactive.proccess()[0]
let temp = nil
if(cached){
temp = factory(cached, ...args)
} else {
temp = factory({},...args)
temp._table = name
temp._id = items.push(temp) -1
temp._table_obj = table
temp._nil = false
temp._active = true
}
updateFilters()
return temp
}
const addFilter = (filter) => {
filters[filter.name] = filter
filter.setOriginal(items)
}
addFilter(filterInactive())
table.new = _new
table.name = name
table.factory = factory
table.filters = filters
table.items = items
table.updateFilters = updateFilters
table.addFilter = addFilter
table.free = (object) => {
recicle(object)
object._active = false
updateFilters()
}
return table
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment