Skip to content

Commit

Permalink
refactor(paths): update path value inference
Browse files Browse the repository at this point in the history
- use OptPathVal for return type of read ops
- use PathVal for value arg in update ops

BREAKING CHANGE: update generics for `UpdateFn`

- UpdateFn now takes input & output type generics
  • Loading branch information
postspectacular committed Mar 27, 2020
1 parent aa9db3a commit ab4440e
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 137 deletions.
4 changes: 3 additions & 1 deletion packages/paths/src/api.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
export type UpdateFn<T> = (curr: T, ...args: any[]) => T;
import type { FnO } from "@thi.ng/api";

export type UpdateFn<A, B> = FnO<A, B>;
28 changes: 12 additions & 16 deletions packages/paths/src/get-in.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,7 @@ import type {
Path6,
Path7,
Path8,
PathVal1,
PathVal2,
PathVal3,
PathVal4,
PathVal5,
PathVal6,
PathVal7,
PathVal8,
OptPathVal,
} from "@thi.ng/api";

/**
Expand Down Expand Up @@ -58,32 +51,35 @@ export const getInUnsafe = <T = any>(state: any, path: Path): T | undefined =>
* @param path -
*/
export function getIn<T>(state: T, path: Path0): T;
export function getIn<T, A>(state: T, path: Path1<T, A>): PathVal1<T, A>;
export function getIn<T, A, B>(state: T, path: Path1<A, B>): PathVal2<T, A, B>;
export function getIn<T, A>(state: T, path: Path1<T, A>): OptPathVal<T, [A]>;
export function getIn<T, A, B>(
state: T,
path: Path1<A, B>
): OptPathVal<T, [A, B]>;
export function getIn<T, A, B, C>(
state: T,
path: Path3<T, A, B, C>
): PathVal3<T, A, B, C>;
): OptPathVal<T, [A, B, C]>;
export function getIn<T, A, B, C, D>(
state: T,
path: Path4<T, A, B, C, D>
): PathVal4<T, A, B, C, D>;
): OptPathVal<T, [A, B, C, D]>;
export function getIn<T, A, B, C, D, E>(
state: T,
path: Path5<T, A, B, C, D, E>
): PathVal5<T, A, B, C, D, E>;
): OptPathVal<T, [A, B, C, D, E]>;
export function getIn<T, A, B, C, D, E, F>(
state: T,
path: Path6<T, A, B, C, D, E, F>
): PathVal6<T, A, B, C, D, E, F>;
): OptPathVal<T, [A, B, C, D, E, F]>;
export function getIn<T, A, B, C, D, E, F, G>(
state: T,
path: Path7<T, A, B, C, D, E, F, G>
): PathVal7<T, A, B, C, D, E, F, G>;
): OptPathVal<T, [A, B, C, D, E, F, G]>;
export function getIn<T, A, B, C, D, E, F, G, H>(
state: T,
path: Path8<T, A, B, C, D, E, F, G, H>
): PathVal8<T, A, B, C, D, E, F, G, H>;
): OptPathVal<T, [A, B, C, D, E, F, G, H]>;
export function getIn<T, A, B, C, D, E, F, G, H>(
state: T,
path: DeepPath<T, A, B, C, D, E, F, G, H>
Expand Down
25 changes: 9 additions & 16 deletions packages/paths/src/getter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,7 @@ import type {
Path6,
Path7,
Path8,
PathVal1,
PathVal2,
PathVal3,
PathVal4,
PathVal5,
PathVal6,
PathVal7,
PathVal8,
OptPathVal,
} from "@thi.ng/api";

/**
Expand Down Expand Up @@ -84,28 +77,28 @@ export const defGetterUnsafe = <T = any>(path: Path): Fn<any, T | undefined> =>
* @param path -
*/
export function defGetter<T>(path: Path0): Fn<T, T>;
export function defGetter<T, A>(path: Path1<T, A>): Fn<T, PathVal1<T, A>>;
export function defGetter<T, A>(path: Path1<T, A>): Fn<T, OptPathVal<T, [A]>>;
export function defGetter<T, A, B>(
path: Path2<T, A, B>
): Fn<T, PathVal2<T, A, B>>;
): Fn<T, OptPathVal<T, [A, B]>>;
export function defGetter<T, A, B, C>(
path: Path3<T, A, B, C>
): Fn<T, PathVal3<T, A, B, C>>;
): Fn<T, OptPathVal<T, [A, B, C]>>;
export function defGetter<T, A, B, C, D>(
path: Path4<T, A, B, C, D>
): Fn<T, PathVal4<T, A, B, C, D>>;
): Fn<T, OptPathVal<T, [A, B, C, D]>>;
export function defGetter<T, A, B, C, D, E>(
path: Path5<T, A, B, C, D, E>
): Fn<T, PathVal5<T, A, B, C, D, E>>;
): Fn<T, OptPathVal<T, [A, B, C, D, E]>>;
export function defGetter<T, A, B, C, D, E, F>(
path: Path6<T, A, B, C, D, E, F>
): Fn<T, PathVal6<T, A, B, C, D, E, F>>;
): Fn<T, OptPathVal<T, [A, B, C, D, E, F]>>;
export function defGetter<T, A, B, C, D, E, F, G>(
path: Path7<T, A, B, C, D, E, F, G>
): Fn<T, PathVal7<T, A, B, C, D, E, F, G>>;
): Fn<T, OptPathVal<T, [A, B, C, D, E, F, G]>>;
export function defGetter<T, A, B, C, D, E, F, G, H>(
path: Path8<T, A, B, C, D, E, F, G, H>
): Fn<T, PathVal8<T, A, B, C, D, E, F, G, H>>;
): Fn<T, OptPathVal<T, [A, B, C, D, E, F, G, H]>>;
export function defGetter<T, A, B, C, D, E, F, G, H>(
path: DeepPath<T, A, B, C, D, E, F, G, H>
): Fn<T, any>;
Expand Down
25 changes: 9 additions & 16 deletions packages/paths/src/mut-in.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,7 @@ import type {
Path6,
Path7,
Path8,
PathVal1,
PathVal2,
PathVal3,
PathVal4,
PathVal5,
PathVal6,
PathVal7,
PathVal8,
PathVal,
} from "@thi.ng/api";

/**
Expand Down Expand Up @@ -68,42 +61,42 @@ export function mutIn<T>(state: T, path: Path0, val: T): T;
export function mutIn<T, A>(
state: T,
path: Path1<T, A>,
val: PathVal1<T, A>
val: PathVal<T, [A]>
): T;
export function mutIn<T, A, B>(
state: T,
path: Path2<T, A, B>,
val: PathVal2<T, A, B>
val: PathVal<T, [A, B]>
): T;
export function mutIn<T, A, B, C>(
state: T,
path: Path3<T, A, B, C>,
val: PathVal3<T, A, B, C>
val: PathVal<T, [A, B, C]>
): T;
export function mutIn<T, A, B, C, D>(
state: T,
path: Path4<T, A, B, C, D>,
val: PathVal4<T, A, B, C, D>
val: PathVal<T, [A, B, C, D]>
): T;
export function mutIn<T, A, B, C, D, E>(
state: T,
path: Path5<T, A, B, C, D, E>,
val: PathVal5<T, A, B, C, D, E>
val: PathVal<T, [A, B, C, D, E]>
): T;
export function mutIn<T, A, B, C, D, E, F>(
state: T,
path: Path6<T, A, B, C, D, E, F>,
val: PathVal6<T, A, B, C, D, E, F>
val: PathVal<T, [A, B, C, D, E, F]>
): T;
export function mutIn<T, A, B, C, D, E, F, G>(
state: T,
path: Path7<T, A, B, C, D, E, F, G>,
val: PathVal7<T, A, B, C, D, E, F, G>
val: PathVal<T, [A, B, C, D, E, F, G]>
): T;
export function mutIn<T, A, B, C, D, E, F, G, H>(
state: T,
path: Path8<T, A, B, C, D, E, F, G, H>,
val: PathVal8<T, A, B, C, D, E, F, G, H>
val: PathVal<T, [A, B, C, D, E, F, G, H]>
): T;
export function mutIn<T, A, B, C, D, E, F, G, H>(
state: T,
Expand Down
25 changes: 9 additions & 16 deletions packages/paths/src/mutator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,7 @@ import type {
Path6,
Path7,
Path8,
PathVal1,
PathVal2,
PathVal3,
PathVal4,
PathVal5,
PathVal6,
PathVal7,
PathVal8,
PathVal,
} from "@thi.ng/api";

/**
Expand Down Expand Up @@ -53,28 +46,28 @@ export const defMutatorUnsafe = <T = any>(path: Path): Fn2<any, T, any> =>
* @param path -
*/
export function defMutator<T>(path: Path0): Fn2<T, T, T>;
export function defMutator<T, A>(path: Path1<T, A>): Fn2<T, PathVal1<T, A>, T>;
export function defMutator<T, A>(path: Path1<T, A>): Fn2<T, PathVal<T, [A]>, T>;
export function defMutator<T, A, B>(
path: Path2<T, A, B>
): Fn2<T, PathVal2<T, A, B>, T>;
): Fn2<T, PathVal<T, [A, B]>, T>;
export function defMutator<T, A, B, C>(
path: Path3<T, A, B, C>
): Fn2<T, PathVal3<T, A, B, C>, T>;
): Fn2<T, PathVal<T, [A, B, C]>, T>;
export function defMutator<T, A, B, C, D>(
path: Path4<T, A, B, C, D>
): Fn2<T, PathVal4<T, A, B, C, D>, T>;
): Fn2<T, PathVal<T, [A, B, C, D]>, T>;
export function defMutator<T, A, B, C, D, E>(
path: Path5<T, A, B, C, D, E>
): Fn2<T, PathVal5<T, A, B, C, D, E>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E]>, T>;
export function defMutator<T, A, B, C, D, E, F>(
path: Path6<T, A, B, C, D, E, F>
): Fn2<T, PathVal6<T, A, B, C, D, E, F>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E, F]>, T>;
export function defMutator<T, A, B, C, D, E, F, G>(
path: Path7<T, A, B, C, D, E, F, G>
): Fn2<T, PathVal7<T, A, B, C, D, E, F, G>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E, F, G]>, T>;
export function defMutator<T, A, B, C, D, E, F, G, H>(
path: Path8<T, A, B, C, D, E, F, G, H>
): Fn2<T, PathVal8<T, A, B, C, D, E, F, G, H>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E, F, G, H]>, T>;
export function defMutator<T, A, B, C, D, E, F, G, H>(
path: DeepPath<T, A, B, C, D, E, F, G, H>
): Fn2<T, any, any>;
Expand Down
25 changes: 9 additions & 16 deletions packages/paths/src/set-in.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,7 @@ import type {
Path6,
Path7,
Path8,
PathVal1,
PathVal2,
PathVal3,
PathVal4,
PathVal5,
PathVal6,
PathVal7,
PathVal8,
PathVal,
} from "@thi.ng/api";

/**
Expand Down Expand Up @@ -65,42 +58,42 @@ export function setIn<T>(state: T, path: Path0, val: T): T;
export function setIn<T, A>(
state: T,
path: Path1<T, A>,
val: PathVal1<T, A>
val: PathVal<T, [A]>
): T;
export function setIn<T, A, B>(
state: T,
path: Path2<T, A, B>,
val: PathVal2<T, A, B>
val: PathVal<T, [A, B]>
): T;
export function setIn<T, A, B, C>(
state: T,
path: Path3<T, A, B, C>,
val: PathVal3<T, A, B, C>
val: PathVal<T, [A, B, C]>
): T;
export function setIn<T, A, B, C, D>(
state: T,
path: Path4<T, A, B, C, D>,
val: PathVal4<T, A, B, C, D>
val: PathVal<T, [A, B, C, D]>
): T;
export function setIn<T, A, B, C, D, E>(
state: T,
path: Path5<T, A, B, C, D, E>,
val: PathVal5<T, A, B, C, D, E>
val: PathVal<T, [A, B, C, D, E]>
): T;
export function setIn<T, A, B, C, D, E, F>(
state: T,
path: Path6<T, A, B, C, D, E, F>,
val: PathVal6<T, A, B, C, D, E, F>
val: PathVal<T, [A, B, C, D, E, F]>
): T;
export function setIn<T, A, B, C, D, E, F, G>(
state: T,
path: Path7<T, A, B, C, D, E, F, G>,
val: PathVal7<T, A, B, C, D, E, F, G>
val: PathVal<T, [A, B, C, D, E, F, G]>
): T;
export function setIn<T, A, B, C, D, E, F, G, H>(
state: T,
path: Path8<T, A, B, C, D, E, F, G, H>,
val: PathVal8<T, A, B, C, D, E, F, G, H>
val: PathVal<T, [A, B, C, D, E, F, G, H]>
): T;
export function setIn<T, A, B, C, D, E, F, G, H>(
state: T,
Expand Down
25 changes: 9 additions & 16 deletions packages/paths/src/setter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,7 @@ import type {
Path6,
Path7,
Path8,
PathVal1,
PathVal2,
PathVal3,
PathVal4,
PathVal5,
PathVal6,
PathVal7,
PathVal8,
PathVal,
NumOrString,
} from "@thi.ng/api";

Expand Down Expand Up @@ -116,28 +109,28 @@ export const defSetterUnsafe = <T = any>(path: Path): Fn2<any, T, any> =>
* @param path -
*/
export function defSetter<T>(path: Path0): Fn2<T, T, T>;
export function defSetter<T, A>(path: Path1<T, A>): Fn2<T, PathVal1<T, A>, T>;
export function defSetter<T, A>(path: Path1<T, A>): Fn2<T, PathVal<T, [A]>, T>;
export function defSetter<T, A, B>(
path: Path2<T, A, B>
): Fn2<T, PathVal2<T, A, B>, T>;
): Fn2<T, PathVal<T, [A, B]>, T>;
export function defSetter<T, A, B, C>(
path: Path3<T, A, B, C>
): Fn2<T, PathVal3<T, A, B, C>, T>;
): Fn2<T, PathVal<T, [A, B, C]>, T>;
export function defSetter<T, A, B, C, D>(
path: Path4<T, A, B, C, D>
): Fn2<T, PathVal4<T, A, B, C, D>, T>;
): Fn2<T, PathVal<T, [A, B, C, D]>, T>;
export function defSetter<T, A, B, C, D, E>(
path: Path5<T, A, B, C, D, E>
): Fn2<T, PathVal5<T, A, B, C, D, E>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E]>, T>;
export function defSetter<T, A, B, C, D, E, F>(
path: Path6<T, A, B, C, D, E, F>
): Fn2<T, PathVal6<T, A, B, C, D, E, F>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E, F]>, T>;
export function defSetter<T, A, B, C, D, E, F, G>(
path: Path7<T, A, B, C, D, E, F, G>
): Fn2<T, PathVal7<T, A, B, C, D, E, F, G>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E, F, G]>, T>;
export function defSetter<T, A, B, C, D, E, F, G, H>(
path: Path8<T, A, B, C, D, E, F, G, H>
): Fn2<T, PathVal8<T, A, B, C, D, E, F, G, H>, T>;
): Fn2<T, PathVal<T, [A, B, C, D, E, F, G, H]>, T>;
export function defSetter<T, A, B, C, D, E, F, G, H>(
path: DeepPath<T, A, B, C, D, E, F, G, H>
): Fn2<T, any, any>;
Expand Down

0 comments on commit ab4440e

Please sign in to comment.