Skip to content

Commit 45f32cc

Browse files
committed
utils(createListener): add createListener util
1 parent 93cd015 commit 45f32cc

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { createListener } from "./"
2+
3+
describe("createListener", () => {
4+
it('receives an "event creator" and it returns a tuple with an observable and its corresponding event-emitter', () => {
5+
const [fooBar$, onFooBar] = createListener((foo: number, bar: string) => ({
6+
foo,
7+
bar,
8+
}))
9+
let receivedValue
10+
fooBar$.subscribe((val) => {
11+
receivedValue = val
12+
})
13+
expect(receivedValue).toBe(undefined)
14+
onFooBar(0, "1")
15+
expect(receivedValue).toEqual({ foo: 0, bar: "1" })
16+
})
17+
it('returns a tuple with a void observable and its corresponding event-emitter when no "event creator" is provided', () => {
18+
const [clicks$, onClick] = createListener()
19+
let count = 0
20+
clicks$.subscribe(() => {
21+
count++
22+
})
23+
expect(count).toBe(0)
24+
onClick()
25+
expect(count).toBe(1)
26+
})
27+
})

packages/utils/src/createListener.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Observable, Subject } from "rxjs"
2+
3+
const defaultMapper: any = () => {}
4+
5+
export function createListener<A extends unknown[], T>(
6+
mapper: (...args: A) => T,
7+
): [Observable<T>, (...args: A) => void]
8+
export function createListener(): [Observable<void>, () => void]
9+
10+
export function createListener<A extends unknown[], T>(
11+
mapper: (...args: A) => T = defaultMapper,
12+
): [Observable<T>, (...args: A) => void] {
13+
const subject = new Subject<T>()
14+
return [subject.asObservable(), (...args: A) => subject.next(mapper(...args))]
15+
}

packages/utils/src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export { collectValues } from "./collectValues"
22
export { collect } from "./collect"
3+
export { createListener } from "./createListener"
34
export { mergeWithKey } from "./mergeWithKey"
45
export { split } from "./split"
56
export { suspend } from "./suspend"

0 commit comments

Comments
 (0)