-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapplicative.ts
More file actions
58 lines (41 loc) · 2.31 KB
/
applicative.ts
File metadata and controls
58 lines (41 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// instance Applicative ((->) a) -- Defined in ‘GHC.Base’
import { $const } from 'ghc/base/functions'
import { applicative as createApplicative, Applicative, BaseImplementation } from 'ghc/base/applicative'
import { FunctionArrow, FunctionArrow2, FunctionArrowBox, withKind } from 'ghc/prim/function-arrow'
import { functor as createFunctor } from 'ghc/base/function-arrow/functor'
export interface FunctionArrowApplicative<T> extends Applicative {
pure<A>(a: A): FunctionArrowBox<T, A>
'<*>'<A, B>(f: FunctionArrowBox<T, FunctionArrow<A, B>>, fa: FunctionArrowBox<T, A>): FunctionArrowBox<T, B>
liftA2<A, B, C>(
f: FunctionArrow2<A, B, C>,
fa: FunctionArrowBox<T, A>,
fb: FunctionArrowBox<T, B>,
): FunctionArrowBox<T, C>
'*>'<A, B>(fa: FunctionArrowBox<T, A>, fb: FunctionArrowBox<T, B>): FunctionArrowBox<T, B>
'<*'<A, B>(fa: FunctionArrowBox<T, A>, fb: FunctionArrowBox<T, B>): FunctionArrowBox<T, A>
'<**>'<A, B>(fa: FunctionArrowBox<T, A>, f: FunctionArrowBox<T, FunctionArrow<A, B>>): FunctionArrowBox<T, B>
fmap<A, B>(f: (a: A) => B, fa: FunctionArrowBox<T, A>): FunctionArrowBox<T, B>
'<$>'<A, B>(f: (a: A) => B, fa: FunctionArrowBox<T, A>): FunctionArrowBox<T, B>
'<$'<A, B>(a: A, fb: FunctionArrowBox<T, B>): FunctionArrowBox<T, A>
'$>'<A, B>(fa: FunctionArrowBox<T, A>, b: B): FunctionArrowBox<T, B>
'<&>'<A, B>(fa: FunctionArrowBox<T, A>, f: (a: A) => B): FunctionArrowBox<T, B>
void<A>(fa: FunctionArrowBox<T, A>): FunctionArrowBox<T, []>
}
const baseImplementation = <T>(): BaseImplementation => ({
// pure = const
pure: <A>(a: NonNullable<A>): FunctionArrowBox<T, A> => withKind($const(a)),
// (<*>) f g x = f x (g x)
'<*>': <A, B>(f: FunctionArrowBox<T, FunctionArrow<A, B>>, fa: FunctionArrowBox<T, A>): FunctionArrowBox<T, B> =>
withKind((x: T) => f(x)(fa(x))),
// liftA2 q f g x = q (f x) (g x)
liftA2: <A, B, C>(
f: FunctionArrow2<A, B, C>,
fa: FunctionArrowBox<T, A>,
fb: FunctionArrowBox<T, B>,
): FunctionArrowBox<T, C> => withKind((x: T) => f(fa(x))(fb(x))),
})
export const applicative = <T>(): FunctionArrowApplicative<T> => {
const base = baseImplementation<T>()
const functor = createFunctor<T>()
return createApplicative(base, functor) as FunctionArrowApplicative<T>
}