Skip to content

Instantly share code, notes, and snippets.

@guiseek
Created June 24, 2023 03:52
Show Gist options
  • Save guiseek/3b6e9588f9d5b774cb6d6f7a700dc1af to your computer and use it in GitHub Desktop.
Save guiseek/3b6e9588f9d5b774cb6d6f7a700dc1af to your computer and use it in GitHub Desktop.
Tiny Observer
import {Observer} from './core/event-emitter'
const observer = new Observer<string>()
const sub1$ = observer.subscribe((value, count) => {
console.log('sub 1: ', value, count)
})
const sub2$ = observer.subscribe((value, count) => {
console.log('sub 2: ', value, count)
})
observer.next('um')
observer.next('dois')
sub1$.unsubscribe()
observer.next('três')
observer.next('quatro')
observer.next('cinco')
sub2$.unsubscribe()
observer.next('seis')
export interface Observed {
unsubscribe(): void
}
export interface Subscribe<T> {
(value: T, count: number): void
}
export class Observer<T> {
#count = 0
#subject = new Set<Subscribe<T>>([])
subscribe(cb: Subscribe<T>): Observed {
this.#subject.add(cb)
const unsubscribe = () => {
this.#subject.delete(cb)
}
return {unsubscribe}
}
next(value: T) {
this.#count++
for (const cb of this.#subject) {
cb(value, this.#count)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment