Skip to content

Instantly share code, notes, and snippets.

@itacirgabral
Created March 29, 2022 15:05
Show Gist options
  • Save itacirgabral/90ed004d42240edd4742ab85a829c6dd to your computer and use it in GitHub Desktop.
Save itacirgabral/90ed004d42240edd4742ab85a829c6dd to your computer and use it in GitHub Desktop.
import Yallist from 'yallist'
const intermittentDrummer = const mkStepwand = ({ delay = 1000, delta = 200, breads = [] }: { delay?: number; delta?: number; breads?: Array<Bread> }) => {
const indians = new Yallist<{ goodFor: number; bread: Bread }>()
let dontStop = true
const steps = () => indians.toArray().map(el => el.bread)
const dates = () => indians.toArray().map(el => el.goodFor)
// pre feeed
for (const bread of breads) {
indians.push({
bread,
goodFor: delay + Math.trunc(delta * (Math.random() - 0.5))
})
}
let blockerResolve: (value: unknown) => void
let blockerReject: (value: unknown) => void
let mkBlocker = new Promise((resolve, reject) => {
blockerResolve = resolve
blockerReject = reject
})
const close = () => {
dontStop = false
blockerReject(null)
}
const pub = (bread: Bread) => {
indians.push({
bread,
goodFor: delay + Math.trunc(delta * (Math.random() - 0.5))
})
if (indians.length === 1) {
blockerResolve(null)
}
}
const pubOver = (bread: Bread) => {
indians.unshift({
bread,
goodFor: delay + Math.trunc(delta * (Math.random() - 0.5))
})
if (indians.length === 1) {
blockerResolve(null)
}
}
const gen = async function * gen () {
while (dontStop) {
if (indians.head) {
const sleepms = indians.head?.value.goodFor ?? 0
await setTimeout(sleepms > delta ? sleepms : delta)
const bread = indians.shift()?.bread
if (bread && dontStop) {
yield bread
} else {
dontStop = false
console.log(`dontStop=${dontStop}`)
}
} else {
await mkBlocker
mkBlocker = new Promise((resolve, reject) => {
blockerResolve = resolve
blockerReject = reject
})
}
}
}
return {
pub,
pubOver,
gen,
steps,
dates,
close
}
}
export {
intermittentDrummer
}
@itacirgabral
Copy link
Author

import { intermittentDrummer } from './'

const {
  gen,
  pub,
  pubOver
} = mkStepwand({ delay: 100, delta: 50 })

let aux = 0
;(async () => {
  for await (const el of gen()) {
    console.log(`aux=${aux++}`)
    console.dir(el)
  }
})()

let serial = 0
setInterval(() => {
  pub({
    serial: `serial=${serial++}`
  })
  pub({
    serial: `serial=${serial++}`
  })
  pub({
    serial: `serial=${serial++}`
  })
  pub({
    serial: `serial=${serial++}`
  })
  pub({
    serial: `serial=${serial++}`
  })
}, 1000)

let furafila = 0
setInterval(() => {
  pubOver({
    furafila: `furafila=${furafila++}`
  })
}, 250)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment