Skip to content

Commit 45cf257

Browse files
committed
Reverse state$ and inputs$ order in useObservable
1 parent 89d4d46 commit 45cf257

File tree

4 files changed

+23
-15
lines changed

4 files changed

+23
-15
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function App() {
8080
type RestrictArray<T> = T extends any[] ? T : []
8181
type InputFactory<State, Inputs = undefined> = Inputs extends undefined
8282
? (state$: Observable<State>) => Observable<State>
83-
: (inputs$: Observable<RestrictArray<Inputs>>, state$: Observable<State>) => Observable<State>
83+
: (state$: Observable<State>, inputs$: Observable<RestrictArray<Inputs>>) => Observable<State>
8484

8585
declare function useObservable<State>(inputFactory: InputFactory<State>): State | null
8686
declare function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State
@@ -140,7 +140,7 @@ import { of } from 'rxjs'
140140
import { map } from 'rxjs/operators'
141141
142142
function App(props: { foo: number }) {
143-
const value = useObservable((inputs$) => inputs$.pipe(
143+
const value = useObservable((_, inputs$) => inputs$.pipe(
144144
map(([val]) => val + 1),
145145
), 200, [props.foo])
146146
return (

playground/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const mockBackendRequest = (event$: Observable<React.MouseEvent<HTMLHeadElement>
1515
function IntervalValue(props: { interval: number }) {
1616
const [clickCallback, value] = useEventCallback(mockBackendRequest, 0, [])
1717
const intervalValue = useObservable<number, number[]>(
18-
(inputs$, _) =>
18+
(_, inputs$) =>
1919
inputs$.pipe(
2020
switchMap(([intervalTime]) => interval(intervalTime)),
2121
scan((acc) => acc + 1, 0),

src/__test__/use-observable.spec.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ describe('useObservable specs', () => {
121121
const spy = Sinon.spy()
122122
const timeToDelay = 200
123123
function Fixture(props: { foo: number; bar: string; baz: any }) {
124-
const value = useObservable((inputs$: Observable<[number, any] | null>) => inputs$.pipe(tap(spy)), null, [
125-
props.foo,
126-
props.baz,
127-
] as any)
124+
const value = useObservable(
125+
(_: Observable<number | null>, inputs$: Observable<[number, any] | null>) => inputs$.pipe(tap(spy)),
126+
null,
127+
[props.foo, props.baz] as any,
128+
)
128129
return (
129130
<>
130131
<h1>{value && value[0]}</h1>

src/use-observable.ts

+15-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@ import useConstant from 'use-constant'
44

55
import { RestrictArray } from './type'
66

7-
export type InputFactory<State> = (state$: Observable<State>) => Observable<State>;
8-
export type InputFactoryWithInputs<State, Inputs> = (inputs$: Observable<RestrictArray<Inputs>>, state$: Observable<State>) => Observable<State>;
9-
export function useObservable<State>(inputFactory: InputFactory<State>): State | null;
10-
export function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State;
11-
export function useObservable<State, Inputs>(inputFactory: InputFactoryWithInputs<State, Inputs>, initialState: State, inputs: RestrictArray<Inputs>): State;
7+
export type InputFactory<State> = (state$: Observable<State>) => Observable<State>
8+
export type InputFactoryWithInputs<State, Inputs> = (
9+
state$: Observable<State>,
10+
inputs$: Observable<RestrictArray<Inputs>>,
11+
) => Observable<State>
12+
export function useObservable<State>(inputFactory: InputFactory<State>): State | null
13+
export function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State
14+
export function useObservable<State, Inputs>(
15+
inputFactory: InputFactoryWithInputs<State, Inputs>,
16+
initialState: State,
17+
inputs: RestrictArray<Inputs>,
18+
): State
1219
export function useObservable<State, Inputs extends ReadonlyArray<any>>(
1320
inputFactory: InputFactoryWithInputs<State, Inputs>,
1421
initialState?: State,
@@ -27,11 +34,11 @@ export function useObservable<State, Inputs extends ReadonlyArray<any>>(
2734
let output$: BehaviorSubject<State>
2835
if (inputs) {
2936
output$ = (inputFactory as (
30-
inputs$: Observable<RestrictArray<Inputs> | undefined>,
3137
state$: Observable<State | undefined>,
32-
) => Observable<State>)(inputs$, state$) as BehaviorSubject<State>
38+
inputs$: Observable<RestrictArray<Inputs> | undefined>,
39+
) => Observable<State>)(state$, inputs$) as BehaviorSubject<State>
3340
} else {
34-
output$ = (inputFactory as unknown as (state$: Observable<State | undefined>) => Observable<State>)(
41+
output$ = ((inputFactory as unknown) as (state$: Observable<State | undefined>) => Observable<State>)(
3542
state$,
3643
) as BehaviorSubject<State>
3744
}

0 commit comments

Comments
 (0)