Skip to content

Commit 7c8f75c

Browse files
authored
Merge pull request #2 from thomasvargiu/missing-functions
Missing functions
2 parents 54d73f9 + 0b9332c commit 7c8f75c

11 files changed

+3683
-8491
lines changed

package-lock.json

Lines changed: 1890 additions & 8472 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
},
3232
"homepage": "https://github.com/siuvdlec/fp-ts-reactive",
3333
"peerDependencies": {
34-
"fp-ts": "^2.4.4",
34+
"fp-ts": "^2.11.0",
3535
"rxjs": "^7.5"
3636
},
3737
"devDependencies": {
@@ -40,7 +40,7 @@
4040
"@types/node": "^13.11.0",
4141
"eslint": "^8.12.0",
4242
"eslint-config-facile": "^0.5.0",
43-
"fp-ts": "^2.11.9",
43+
"fp-ts": "^2.11.0",
4444
"import-path-rewrite": "github:gcanti/import-path-rewrite",
4545
"jest": "^27.5.1",
4646
"prettier": "^2.6.2",

src/FromObservable.ts

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
/**
2+
* Lift a computation from the `Observable` monad
3+
*
4+
* @since 0.6.12
5+
*/
6+
import { Chain, Chain1, Chain2, Chain2C, Chain3, Chain3C, Chain4, chainFirst } from 'fp-ts/Chain'
7+
import type { FromTask, FromTask1, FromTask2, FromTask2C, FromTask3, FromTask3C, FromTask4 } from 'fp-ts/FromTask'
8+
import { flow } from 'fp-ts/function'
9+
// eslint-disable-next-line fp-ts/no-lib-imports
10+
import type { HKT, Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4 } from 'fp-ts/lib/HKT'
11+
import type { Observable } from 'rxjs'
12+
13+
// -------------------------------------------------------------------------------------
14+
// model
15+
// -------------------------------------------------------------------------------------
16+
17+
/**
18+
* @category model
19+
* @since 0.6.12
20+
*/
21+
export interface FromObservable<F> extends FromTask<F> {
22+
readonly fromObservable: <A>(fa: Observable<A>) => HKT<F, A>
23+
}
24+
25+
/**
26+
* @category model
27+
* @since 0.6.12
28+
*/
29+
export interface FromObservable1<F extends URIS> extends FromTask1<F> {
30+
readonly fromObservable: <A>(fa: Observable<A>) => Kind<F, A>
31+
}
32+
33+
/**
34+
* @category model
35+
* @since 0.6.12
36+
*/
37+
export interface FromObservable2<F extends URIS2> extends FromTask2<F> {
38+
readonly fromObservable: <A, E>(fa: Observable<A>) => Kind2<F, E, A>
39+
}
40+
41+
/**
42+
* @category model
43+
* @since 0.6.12
44+
*/
45+
export interface FromObservable2C<F extends URIS2, E> extends FromTask2C<F, E> {
46+
readonly fromObservable: <A>(fa: Observable<A>) => Kind2<F, E, A>
47+
}
48+
49+
/**
50+
* @category model
51+
* @since 0.6.12
52+
*/
53+
export interface FromObservable3<F extends URIS3> extends FromTask3<F> {
54+
readonly fromObservable: <A, R, E>(fa: Observable<A>) => Kind3<F, R, E, A>
55+
}
56+
57+
/**
58+
* @category model
59+
* @since 0.6.12
60+
*/
61+
export interface FromObservable3C<F extends URIS3, E> extends FromTask3C<F, E> {
62+
readonly fromObservable: <A, R>(fa: Observable<A>) => Kind3<F, R, E, A>
63+
}
64+
65+
/**
66+
* @category model
67+
* @since 0.6.12
68+
*/
69+
export interface FromObservable4<F extends URIS4> extends FromTask4<F> {
70+
readonly fromObservable: <A, S, R, E>(fa: Observable<A>) => Kind4<F, S, R, E, A>
71+
}
72+
73+
// -------------------------------------------------------------------------------------
74+
// combinators
75+
// -------------------------------------------------------------------------------------
76+
77+
/**
78+
* @since 0.6.12
79+
*/
80+
export function fromObservableK<F extends URIS4>(
81+
F: FromObservable4<F>
82+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => <S, R, E>(...a: A) => Kind4<F, S, R, E, B>
83+
export function fromObservableK<F extends URIS3>(
84+
F: FromObservable3<F>
85+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => <R, E>(...a: A) => Kind3<F, R, E, B>
86+
export function fromObservableK<F extends URIS3, E>(
87+
F: FromObservable3C<F, E>
88+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => <R>(...a: A) => Kind3<F, R, E, B>
89+
export function fromObservableK<F extends URIS2>(
90+
F: FromObservable2<F>
91+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => <E>(...a: A) => Kind2<F, E, B>
92+
export function fromObservableK<F extends URIS2, E>(
93+
F: FromObservable2C<F, E>
94+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => (...a: A) => Kind2<F, E, B>
95+
export function fromObservableK<F extends URIS>(
96+
F: FromObservable1<F>
97+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => (...a: A) => Kind<F, B>
98+
export function fromObservableK<F>(
99+
F: FromObservable<F>
100+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => (...a: A) => HKT<F, B>
101+
export function fromObservableK<F>(
102+
F: FromObservable<F>
103+
): <A extends ReadonlyArray<unknown>, B>(f: (...a: A) => Observable<B>) => (...a: A) => HKT<F, B> {
104+
return f => flow(f, F.fromObservable)
105+
}
106+
107+
/**
108+
* @since 0.6.12
109+
*/
110+
export function chainObservableK<M extends URIS4>(
111+
F: FromObservable4<M>,
112+
M: Chain4<M>
113+
): <A, B>(f: (a: A) => Observable<B>) => <S, R, E>(first: Kind4<M, S, R, E, A>) => Kind4<M, S, R, E, B>
114+
export function chainObservableK<M extends URIS3>(
115+
F: FromObservable3<M>,
116+
M: Chain3<M>
117+
): <A, B>(f: (a: A) => Observable<B>) => <R, E>(first: Kind3<M, R, E, A>) => Kind3<M, R, E, B>
118+
export function chainObservableK<M extends URIS3, E>(
119+
F: FromObservable3C<M, E>,
120+
M: Chain3C<M, E>
121+
): <A, B>(f: (a: A) => Observable<B>) => <R>(first: Kind3<M, R, E, A>) => Kind3<M, R, E, B>
122+
export function chainObservableK<M extends URIS2>(
123+
F: FromObservable2<M>,
124+
M: Chain2<M>
125+
): <A, B>(f: (a: A) => Observable<B>) => <E>(first: Kind2<M, E, A>) => Kind2<M, E, B>
126+
export function chainObservableK<M extends URIS2, E>(
127+
F: FromObservable2C<M, E>,
128+
M: Chain2C<M, E>
129+
): <A, B>(f: (a: A) => Observable<B>) => (first: Kind2<M, E, A>) => Kind2<M, E, B>
130+
export function chainObservableK<M extends URIS>(
131+
F: FromObservable1<M>,
132+
M: Chain1<M>
133+
): <A, B>(f: (a: A) => Observable<B>) => (first: Kind<M, A>) => Kind<M, B>
134+
export function chainObservableK<M>(
135+
F: FromObservable<M>,
136+
M: Chain<M>
137+
): <A, B>(f: (a: A) => Observable<B>) => (first: HKT<M, A>) => HKT<M, B>
138+
export function chainObservableK<M>(
139+
F: FromObservable<M>,
140+
M: Chain<M>
141+
): <A, B>(f: (a: A) => Observable<B>) => (first: HKT<M, A>) => HKT<M, B> {
142+
return f => {
143+
const g = flow(f, F.fromObservable)
144+
return first => M.chain(first, g)
145+
}
146+
}
147+
148+
/**
149+
* @since 0.6.12
150+
*/
151+
export function chainFirstObservableK<M extends URIS4>(
152+
F: FromObservable4<M>,
153+
M: Chain4<M>
154+
): <A, B>(f: (a: A) => Observable<B>) => <S, R, E>(first: Kind4<M, S, R, E, A>) => Kind4<M, S, R, E, A>
155+
export function chainFirstObservableK<M extends URIS3>(
156+
F: FromObservable3<M>,
157+
M: Chain3<M>
158+
): <A, B>(f: (a: A) => Observable<B>) => <R, E>(first: Kind3<M, R, E, A>) => Kind3<M, R, E, A>
159+
export function chainFirstObservableK<M extends URIS3, E>(
160+
F: FromObservable3C<M, E>,
161+
M: Chain3C<M, E>
162+
): <A, B>(f: (a: A) => Observable<B>) => <R>(first: Kind3<M, R, E, A>) => Kind3<M, R, E, A>
163+
export function chainFirstObservableK<M extends URIS2>(
164+
F: FromObservable2<M>,
165+
M: Chain2<M>
166+
): <A, B>(f: (a: A) => Observable<B>) => <E>(first: Kind2<M, E, A>) => Kind2<M, E, A>
167+
export function chainFirstObservableK<M extends URIS2, E>(
168+
F: FromObservable2C<M, E>,
169+
M: Chain2C<M, E>
170+
): <A, B>(f: (a: A) => Observable<B>) => (first: Kind2<M, E, A>) => Kind2<M, E, A>
171+
export function chainFirstObservableK<M extends URIS>(
172+
F: FromObservable1<M>,
173+
M: Chain1<M>
174+
): <A, B>(f: (a: A) => Observable<B>) => (first: Kind<M, A>) => Kind<M, A>
175+
export function chainFirstObservableK<M>(
176+
F: FromObservable<M>,
177+
M: Chain<M>
178+
): <A, B>(f: (a: A) => Observable<B>) => (first: HKT<M, A>) => HKT<M, A>
179+
export function chainFirstObservableK<M>(
180+
F: FromObservable<M>,
181+
M: Chain<M>
182+
): <A, B>(f: (a: A) => Observable<B>) => (first: HKT<M, A>) => HKT<M, A> {
183+
const chainFirstM = chainFirst(M)
184+
return f => chainFirstM(flow(f, F.fromObservable))
185+
}

src/Observable.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { Alt1 } from 'fp-ts/Alt'
55
import type { Alternative1 } from 'fp-ts/Alternative'
66
import type { Applicative1 } from 'fp-ts/Applicative'
77
import type { Apply1 } from 'fp-ts/Apply'
8+
import type { Chain1 } from 'fp-ts/Chain'
89
import type { Compactable1, Separated } from 'fp-ts/Compactable'
910
import * as E from 'fp-ts/Either'
1011
import type { Filterable1 } from 'fp-ts/Filterable'
@@ -14,11 +15,13 @@ import type { MonadIO1 } from 'fp-ts/MonadIO'
1415
import type { MonadTask1 } from 'fp-ts/MonadTask'
1516
import type { Monoid } from 'fp-ts/Monoid'
1617
import * as O from 'fp-ts/Option'
18+
import type { Pointed1 } from 'fp-ts/Pointed'
1719
import type { Task } from 'fp-ts/Task'
1820
import { flow, identity, Predicate, Refinement } from 'fp-ts/function'
1921
import { pipe } from 'fp-ts/function'
2022
import { combineLatest, defer, EMPTY, lastValueFrom, merge, Observable, of as rxOf } from 'rxjs'
2123
import { map as rxMap, mergeMap } from 'rxjs/operators'
24+
import type { FromObservable1 } from './FromObservable'
2225
import type { MonadObservable1 } from './MonadObservable'
2326

2427
// -------------------------------------------------------------------------------------
@@ -273,6 +276,26 @@ export const getMonoid = <A = never>(): Monoid<Observable<A>> => ({
273276
empty: EMPTY,
274277
})
275278

279+
/**
280+
* @category instances
281+
* @since 0.6.12
282+
*/
283+
export const Pointed: Pointed1<URI> = {
284+
URI,
285+
of,
286+
}
287+
288+
/**
289+
* @category instances
290+
* @since 0.6.12
291+
*/
292+
export const FromObservable: FromObservable1<URI> = {
293+
URI,
294+
fromIO,
295+
fromTask,
296+
fromObservable: identity,
297+
}
298+
276299
/**
277300
* @category instances
278301
* @since 0.6.12
@@ -303,6 +326,17 @@ export const Applicative: Applicative1<URI> = {
303326
of,
304327
}
305328

329+
/**
330+
* @category instances
331+
* @since 0.6.12
332+
*/
333+
export const Chain: Chain1<URI> = {
334+
URI,
335+
map: map_,
336+
ap: ap_,
337+
chain: chain_,
338+
}
339+
306340
/**
307341
* @category instances
308342
* @since 0.6.12

0 commit comments

Comments
 (0)