Skip to content

Instantly share code, notes, and snippets.

export default async (
...promises
) => {
return (await Promise.race([
Promise.all(promises),
Promise.all([promises])
]))[0] !== promises
}
@Lcfvs
Lcfvs / events.js
Last active January 23, 2022 18:05
Event listening avoiding memory leaks & associating a weak context
const { assign, create, freeze } = Object
const contexts = new Map()
export const capture = true
export const once = true
export const passive = true
export const context = (listener, event) => {
const { currentTarget, target, type } = event
@Lcfvs
Lcfvs / EventHandler.js
Last active September 28, 2021 11:41
An iterable event handler
const registry = new FinalizationRegistry(handler => handler.disconnect())
class EventHandler {
#consumed = false
#options = null
#prevent = false
#promises = []
#resolve = null
#ref = null
#type = null
@Lcfvs
Lcfvs / MutationObserver.js
Last active September 28, 2021 13:22
A MutationObserver providing an iterator
export class MutationObserver extends globalThis.MutationObserver {
#consumed = false
#promises = []
#resolve = null
#enqueue = record => {
if (this.#resolve) {
this.#resolve(record)
this.#next()
}
@Lcfvs
Lcfvs / dependencies.js
Created July 19, 2021 11:26
Late dependencies
export default new Proxy(new Map(), {
get: (target, name) => {
if (!target.has(name)) {
target.set(name, [[]])
}
const entry = target.get(name)
const [resolvers, value] = entry
return entry.length === 2
@Lcfvs
Lcfvs / example.js
Created June 17, 2021 00:59
typed fetcher
import * as fetcher from './text-fetcher.js'
const fetchText = event => fetcher.resolver.resolve(event)
document.querySelector('form')
.addEventListener('submit', fetchText)
document.querySelector('a')
.addEventListener('click', fetchText)
@Lcfvs
Lcfvs / example.js
Last active June 16, 2021 17:31
a simple fetcher, based on actions
import { resolve, text } from './fetcher.js'
const fetchText = event => resolve(event, [
fetch,
text,
data => console.log({ data })
])
document.querySelector('form')
.addEventListener('submit', fetchText)
@Lcfvs
Lcfvs / fileToURI.js
Created June 11, 2021 22:40
fileToURI.js
const fileToURI = async file => new Promise((onload, onerror) =>
Object.assign(new FileReader(), { onload, onerror })
.readAsDataURL(file))
@Lcfvs
Lcfvs / controller.js
Last active May 25, 2021 11:02
abort controller with progress
function* controller (end) {
let progress = 0
while (1) {
const value = yield progress
if (value === end) {
break
}
@Lcfvs
Lcfvs / controller.js
Last active July 8, 2021 09:50
abort controller generator
function* controller (end) {
while (end !== (yield)) {}
}
const end = Symbol()
const it = controller(end)
console.log(it.next()) // { value: undefined, done: false }
console.log(it.next(end)) // { value: undefined, done: true } -> aborted