Skip to content

Instantly share code, notes, and snippets.

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 / 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 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)
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])
}
@slikts
slikts / mapUntil.ts
Last active February 23, 2018 10:17
const mapUntil = function*<T, K>(
fn: (a: T) => K,
p: (a: K) => boolean,
xs: T[]
): IterableIterator<K> {
for (const x of xs) {
const result = fn(x)
if (!p(result)) {
break
}
const makeArray = (length, f) => Array.from({ length }, f);
const range = (a, b) => makeArray(Math.abs(b - a) + 1, (_, i) => a + (i * Math.sign(b - a)));