Skip to content

Instantly share code, notes, and snippets.

'use strict'
class Attrs extends Array {
constructor(els, name) {
super()
Object.assign(this, {els, name})
}
get() {
return Object.assign(this, this.els.map(el => el.getAttribute(name)))
}
function* cycle(list) {
const arr = [...list]
let i = 0
for (;;) {
i = (i + ((yield arr[i]) || 1)) % arr.length
}
}
const it = cycle(['a', 'b', 'c'])
if (!Object.values && !Object.entries) {
const values = o => Object.keys(o).map(x => o[x])
const entries = o => Object.keys(o).map(x => [x, o[x]])
Object.assign(Object, {values, entries})
}
@slikts
slikts / Deferred.js
Last active June 8, 2016 17:53
Rate-limited concurrent promises using an iterator
class Deferred extends Promise {
constructor() {
let resolve, reject
super((...args) => [resolve, reject] = args)
Object.assign(this, {resolve, reject})
}
}
Deferred.tasks = (list, limit = list.length) => {
const promises = list.map(task => {
function exec(iterator) {
@slikts
slikts / concise-deep-flatten.js
Last active June 19, 2016 14:43
Not that great due to stack limits with variadic params
const flattenDeep = x => Array.isArray(x) ? [].concat(...x.map(flattenDeep)) : x
@slikts
slikts / fizzBuzz.js
Last active April 9, 2017 10:13
FizzBuzz oneliner
const fizzBuzz = (a, b) => Array.from(Array(b - a), (_, i) =>a + i).map(x => `${!(x % 5) ? 'Fizz' : ''}${!(x % 3) ? 'Buzz' : ''}` || x)
@slikts
slikts / SilenceablePromise.ts
Last active April 6, 2017 20:34
A promise whose results can be discarded; a quick and dirty substitute for canceling Fetch API
class SilenceablePromise<T> extends Promise<T> {
silence: () => void
constructor(
executor: (
resolve: (value?: T | PromiseLike<T>) => void,
reject: (reason?: any) => void,
) => void,
) {
let silence: any
export const autobind = (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
Object.defineProperty(target, propertyKey, {
...descriptor,
value: descriptor.value.bind(target),
})
}
@slikts
slikts / fizzBuzz.js
Last active December 5, 2018 11:33
Enterprise edition
const Range = (a, b) => Array.from({ length: b - a }, (_, i) => a + i)
const NumTest = (n, text) => k => !(k % n) ? text : ''
const Tests = data => Object.entries(data).map(([n, text]) => NumTest(n, text))
const RangeTest = tests => n => tests.map(fn => fn(n)).join('') || n
const RangeMap = (a, b, tests) => Range(a, b).map(RangeTest(tests))
const fizzBuzz = (a, b) => RangeMap(a, b, Tests({
5: 'Fizz',
3: 'Buzz',
}))
class LazyArray extends Array {
constructor() {
super()
this[Array.species] = new.target
}
*lazyMap(fn) {
for (let i = 0; i < this.length; i++) {
yield fn(this[i])
}