Skip to content
This repository has been archived by the owner on May 3, 2021. It is now read-only.

Commit

Permalink
feat: more port of monocle-ts
Browse files Browse the repository at this point in the history
Cleaned up some types in the fns.ts file. Also added the flow
operator as it's used in the monocle-ts port.

Implemented the following basic monocle-ts files:
* iso
* lens
* optional
* prism

I haven't implemented traversal yet, but will soon.

I also updated getOrElse in option.ts to be pipeable and
renamed getMonad to getRightMonad in these.ts so it is
more accurate. This necessitated updating a few references.
  • Loading branch information
baetheus committed Sep 28, 2020
1 parent e094a9d commit 9d0892f
Show file tree
Hide file tree
Showing 10 changed files with 778 additions and 117 deletions.
4 changes: 2 additions & 2 deletions decode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ export type DecodeError = FS.FreeSemigroup<DE.DecodeError<string>>;

export type Decoded<A> = E.Either<DecodeError, A>;

export type InputOf<D> = D extends Decoder<infer I, any> ? I : never;
export type InputOf<D> = D extends Decoder<infer I, infer _> ? I : never;

export type TypeOf<D> = D extends Decoder<any, infer A> ? A : never;
export type TypeOf<D> = D extends Decoder<infer _, infer A> ? A : never;

/***************************************************************************************************
* @section Modules
Expand Down
293 changes: 182 additions & 111 deletions fns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,124 +41,195 @@ export const curry3 = <A, B, C, D>(fn: (a: A, b: B, c: C) => D) =>

export const identity = <A>(a: A): A => a;

export const flip = <A, B, C>(f: (a: A) => (b: B) => C) =>
(b: B) =>
(
a: A,
): C => f(a)(b);
export const flip = <A, B, C>(f: Fn<[A], Fn<[B], C>>): Fn<[B], Fn<[A], C>> =>
(b) => (a) => f(a)(b);

export const compose = <A, B>(fab: (a: A) => B) =>
<C>(fbc: (b: B) => C) =>
(
a: A,
): C => fbc(fab(a));
export const compose = <A, B>(fab: Fn<[A], B>) =>
<C>(fbc: Fn<[B], C>): Fn<[A], C> => (a) => fbc(fab(a));

export const constant = <A>(a: A): Lazy<A> => () => a;

// export const isNil = <A>(a: A): a is Nul

/***************************************************************************************************
* @section Pipe
* Original pipe function pulled from fp-ts and modified
* https://github.com/gcanti/fp-ts/blob/master/src/pipeable.ts
**************************************************************************************************/

export function pipe<A>(a: A): A;
export function pipe<A, B>(a: A, ab: (a: A) => B): B;
export function pipe<A, B, C>(a: A, ab: (a: A) => B, bc: (b: B) => C): C;
export function pipe<A, B, C, D>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
): D;
export function pipe<A, B, C, D, E>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
): E;
export function pipe<A, B, C, D, E, F>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
): F;
export function pipe<A, B, C, D, E, F, G>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
): G;
export function pipe<A, B, C, D, E, F, G, H>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
): H;
export function pipe<A, B, C, D, E, F, G, H, I>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
): I;
export function pipe<A, B, C, D, E, F, G, H, I, J, K>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
jk: (j: J) => K,
): K;
export function pipe<A, B, C, D, E, F, G, H, I, J, K, L>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
jk: (j: J) => K,
kl: (K: K) => L,
): L;
export function pipe<A, B, C, D, E, F, G, H, I, J, K, L>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
jk: (j: J) => K,
kl: (K: K) => L,
end: never,
): L;
export function pipe(a: unknown, ...fns: Function[]): unknown {
return fns.reduce((val, fn) => fn(val), a);
}
export type PipeFn = {
<A>(a: A): A;
<A, B>(a: A, ab: (a: A) => B): B;
<A, B, C>(a: A, ab: (a: A) => B, bc: (b: B) => C): C;
<A, B, C, D>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
): D;
<A, B, C, D, E>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
): E;
<A, B, C, D, E, F>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
): F;
<A, B, C, D, E, F, G>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
): G;
<A, B, C, D, E, F, G, H>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
): H;
<A, B, C, D, E, F, G, H, I>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
): I;
<A, B, C, D, E, F, G, H, I, J, K>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
jk: (j: J) => K,
): K;
<A, B, C, D, E, F, G, H, I, J, K, L>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
jk: (j: J) => K,
kl: (K: K) => L,
): L;
<A, B, C, D, E, F, G, H, I, J, K, L>(
a: A,
ab: (a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
jk: (j: J) => K,
kl: (K: K) => L,
end: never,
): L;
};

export const pipe: PipeFn = (a: unknown, ...fns: Function[]): unknown =>
fns.reduce((val, fn) => fn(val), a);

/***************************************************************************************************
* @section Flow
* Original flow function pulled from fp-ts and modified
* https://github.com/gcanti/fp-ts/blob/master/src/functions.ts
**************************************************************************************************/

type FlowFn = {
<A extends ReadonlyArray<unknown>, B>(ab: (...a: A) => B): (...a: A) => B;
<A extends ReadonlyArray<unknown>, B, C>(
ab: (...a: A) => B,
bc: (b: B) => C,
): (...a: A) => C;
<A extends ReadonlyArray<unknown>, B, C, D>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
): (...a: A) => D;
<A extends ReadonlyArray<unknown>, B, C, D, E>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
): (...a: A) => E;
<A extends ReadonlyArray<unknown>, B, C, D, E, F>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
): (...a: A) => F;
<A extends ReadonlyArray<unknown>, B, C, D, E, F, G>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
): (...a: A) => G;
<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
): (...a: A) => H;
<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H, I>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
): (...a: A) => I;
<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H, I, J>(
ab: (...a: A) => B,
bc: (b: B) => C,
cd: (c: C) => D,
de: (d: D) => E,
ef: (e: E) => F,
fg: (f: F) => G,
gh: (g: G) => H,
hi: (h: H) => I,
ij: (i: I) => J,
): (...a: A) => J;
};

export const flow: FlowFn = <AS extends any[], B>(
a: (...as: AS) => B,
...fns: Function[]
): (...as: AS) => any => {
return (...args: AS): any => fns.reduce((b, f) => f(b), a(...args));
};

0 comments on commit 9d0892f

Please sign in to comment.