Initial commit
This commit is contained in:
commit
6d1d65783f
|
@ -0,0 +1,78 @@
|
|||
/**
|
||||
* Wrapper for Object functions
|
||||
*/
|
||||
class ObjectHelper {
|
||||
static values(obj) {
|
||||
return Object.values(obj)
|
||||
}
|
||||
|
||||
static entries(obj) {
|
||||
return Object.entries(obj)
|
||||
}
|
||||
|
||||
static reduce(obj, fn, init) {
|
||||
return this.entries(obj).reduce(fn, init || {})
|
||||
}
|
||||
|
||||
static reduceTo(arr, key_fn, val_fn, init) {
|
||||
return arr.reduce((acc, el, id) => ({
|
||||
...acc, [key_fn(el, id)]: val_fn(el, id)
|
||||
}), init || {})
|
||||
}
|
||||
|
||||
static map(obj, fn) {
|
||||
return this.entries(obj).map(fn)
|
||||
}
|
||||
|
||||
static flatMap(obj, fn, unique = false) {
|
||||
const map = this.entries(obj).flatMap(fn)
|
||||
if (unique) {
|
||||
return map.filter(UniqueList.filter)
|
||||
}
|
||||
return map
|
||||
}
|
||||
|
||||
static filter(obj, predicate) {
|
||||
let filtered = {}
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key) && predicate(key, obj[key])) {
|
||||
filtered[key] = obj[key]
|
||||
}
|
||||
}
|
||||
return filtered
|
||||
}
|
||||
|
||||
/**
|
||||
* Map parent: { child } to 'parent.child' for fields
|
||||
*/
|
||||
static flattenTree(source, fields, split = '.') {
|
||||
return fields.reduce((flat, field) => {
|
||||
let parts = field.split(split)
|
||||
let target = source
|
||||
while (parts.length > 1) { // Walk tree
|
||||
target = target[parts.shift()] || {}
|
||||
}
|
||||
flat[field] = target[parts.shift()]
|
||||
return flat
|
||||
}, {})
|
||||
}
|
||||
|
||||
/**
|
||||
* Map 'parent.child' to parent: { child }
|
||||
*/
|
||||
static expandTree(source, split = '.') {
|
||||
return this.reduce(source, (tree, [key, value]) => {
|
||||
let parts = key.split(split)
|
||||
let target = tree
|
||||
while (parts.length > 1) { // Create tree
|
||||
let child = parts.shift()
|
||||
if (target[child] == undefined) {
|
||||
target[child] = {}
|
||||
}
|
||||
target = target[child]
|
||||
}
|
||||
target[parts.shift()] = value
|
||||
return tree
|
||||
})
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
class TimeHelper {
|
||||
static throttle(func, limit) {
|
||||
let inThrottle
|
||||
return function() {
|
||||
const args = arguments
|
||||
const context = this
|
||||
if (!inThrottle) {
|
||||
func.apply(context, args)
|
||||
inThrottle = true
|
||||
setTimeout(() => inThrottle = false, limit)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static throttleLast(func, limit) {
|
||||
let lastFunc
|
||||
let lastRan
|
||||
return function() {
|
||||
const context = this
|
||||
const args = arguments
|
||||
if (!lastRan) {
|
||||
func.apply(context, args)
|
||||
lastRan = Date.now()
|
||||
} else {
|
||||
clearTimeout(lastFunc)
|
||||
lastFunc = setTimeout(function() {
|
||||
if ((Date.now() - lastRan) >= limit) {
|
||||
func.apply(context, args)
|
||||
lastRan = Date.now()
|
||||
}
|
||||
}, limit - (Date.now() - lastRan))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* List of unique values (Set)
|
||||
*/
|
||||
class UniqueList {
|
||||
constructor() {
|
||||
this.list = {}
|
||||
}
|
||||
|
||||
add(key) {
|
||||
this.list[key] = 1
|
||||
}
|
||||
|
||||
toArray() {
|
||||
return Object.keys(this.list)
|
||||
}
|
||||
|
||||
static filter(value, index, self) {
|
||||
return self.indexOf(value) === index
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
function loadScripts(libs, callback) {
|
||||
return (event) => {
|
||||
if (event) {
|
||||
event.target.remove()
|
||||
}
|
||||
const lib = libs.shift()
|
||||
if (lib) {
|
||||
const script = document.createElement('script')
|
||||
script.src = lib
|
||||
script.onload = loadScripts(libs, callback)
|
||||
document.body.append(script)
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue