Skip to content

Instantly share code, notes, and snippets.

@Sawtaytoes
Last active February 27, 2020 11:32
Show Gist options
  • Save Sawtaytoes/7b6bf968510fe88df3ec98846a641779 to your computer and use it in GitHub Desktop.
Save Sawtaytoes/7b6bf968510fe88df3ec98846a641779 to your computer and use it in GitHub Desktop.
`createIteratorSubject` allows someone to create an observable out of a generator and tell RxJS when to pull the next value instead of relying on the official implementation which creates backpressure.
const { BehaviorSubject, Subject } = require('rxjs')
const { map, tap, withLatestFrom } = require('rxjs/operators')
const createIteratorSubject = (
iterator,
) => {
const iterator$ = (
new BehaviorSubject()
)
const pushNextValue = ({
done,
value,
}) => {
done
&& value === undefined
? (
iterator$
.complete()
)
: (
iterator$
.next(value)
)
}
iterator$
.push = (
value,
) => (
pushNextValue(
iterator
.next(value)
)
)
iterator$
.push()
return iterator$
}
module.exports = createIteratorSubject
@anilanar
Copy link

What an interesting code format, do you have an auto formatter for that?

@Sawtaytoes
Copy link
Author

@anilanar I'd love to have an auto-formatter and will be looking into using ESLint rules to achieve it (if that's even possible).

Unlike Prettier, there are a set of rules I follow so it's easy for someone else to replicate and get the same results. At my last job, you'd be unable to tell my code apart from my coworkers'. In fact, there was one bug we ended up fixing in separate PRs with the exact same solution line-by-line.

@Sawtaytoes
Copy link
Author

@anilanar I now have an eslint extension available.

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