@kaumlaut/pure 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,26 @@
1
+ import type { Guard } from "@kaumlaut/pure/guard";
2
+ export type Failed = {
3
+ error: Readonly<string>;
4
+ type: "Failed";
5
+ };
6
+ export type None = {
7
+ type: "None";
8
+ };
9
+ export type Loading = {
10
+ type: "Loading";
11
+ };
12
+ export type Success<T> = {
13
+ data: Readonly<T>;
14
+ type: "Success";
15
+ };
16
+ export type FetchState<T> = Failed | None | Loading | Success<T>;
17
+ export declare function isLoading<T>(state: FetchState<T>): state is Loading;
18
+ export declare function isFailed<T>(state: FetchState<T>): state is Failed;
19
+ export declare function isNone<T>(state: FetchState<T>): state is None;
20
+ export declare function isSuccess<T>(state: FetchState<T>): state is Success<T>;
21
+ export declare function fail(error: string): Failed;
22
+ export declare function load(): Loading;
23
+ export declare function none(): None;
24
+ export declare function attempt<T>(data: unknown, guard: Guard<T>, error?: string): Success<T> | Failed;
25
+ export declare function mapFailed<T>(state: FetchState<T>, mapper: (state: Failed) => FetchState<T>): FetchState<T>;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch-state/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACvB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjE,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,CAEnE;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,CAEjE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAE7D;AACD,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAEtE;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1C;AAED,wBAAgB,IAAI,IAAI,OAAO,CAI9B;AAED,wBAAgB,IAAI,IAAI,IAAI,CAI3B;AACD,wBAAgB,OAAO,CAAC,CAAC,EACvB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,KAAK,GAAE,MAA6E,GACnF,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAYrB;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GACvC,UAAU,CAAC,CAAC,CAAC,CAMf"}
@@ -0,0 +1,46 @@
1
+ export function isLoading(state) {
2
+ return state.type === "Loading";
3
+ }
4
+ export function isFailed(state) {
5
+ return state.type === "Failed";
6
+ }
7
+ export function isNone(state) {
8
+ return state.type === "None";
9
+ }
10
+ export function isSuccess(state) {
11
+ return state.type === "Success";
12
+ }
13
+ export function fail(error) {
14
+ return {
15
+ type: "Failed",
16
+ error,
17
+ };
18
+ }
19
+ export function load() {
20
+ return {
21
+ type: "Loading",
22
+ };
23
+ }
24
+ export function none() {
25
+ return {
26
+ type: "None",
27
+ };
28
+ }
29
+ export function attempt(data, guard, error = "Guard did not pass. Ensure the attempted data has the correct type") {
30
+ if (guard(data)) {
31
+ return {
32
+ type: "Success",
33
+ data,
34
+ };
35
+ }
36
+ return {
37
+ type: "Failed",
38
+ error,
39
+ };
40
+ }
41
+ export function mapFailed(state, mapper) {
42
+ if (isFailed(state)) {
43
+ return mapper(state);
44
+ }
45
+ return state;
46
+ }
@@ -13,8 +13,13 @@ export declare function isObjectWithKeysMatchingGuard<T extends object>(guards:
13
13
  export declare function isExactString<T extends string>(expectedString: string): (value: unknown) => value is T;
14
14
  export declare function isOneStringOf<T extends string>(validValues: string[]): (value: unknown) => value is T;
15
15
  export declare function always<T>(value: unknown): value is T;
16
+ export declare function never<T>(value: unknown): value is T;
16
17
  export declare function isBool(value: unknown): value is boolean;
17
18
  export declare function isNull(value: unknown): value is null;
18
19
  export declare function isListOf<T>(guard: Guard<T>): (value: unknown) => value is T[];
19
20
  export declare function oneOf<T1, T2>(a: Guard<T1>, b: Guard<T2>): (value: unknown) => value is T1 | T2;
21
+ export declare function isObjectWithAllKeysMatchingGuard<B, T extends {
22
+ [key: string]: B;
23
+ }>(guard: Guard<B>): (value: unknown) => value is T;
24
+ export declare function isStringWithPattern(pattern: RegExp): Guard<string>;
20
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAEtD,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAEzE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GACb,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,CAGrC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMrD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMvD;AAMD,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,GAAG,EAAE,MAAM,CAAC,GACX,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAChB,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE;KACrE,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAIjC;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,cAAc,EAAE,MAAM,GACrB,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,WAAW,EAAE,MAAM,EAAE,GACpB,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAEpD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAEvD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAEpD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE,CAG7E;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,EAAE,EAC1B,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EACZ,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GACX,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAEtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAEtD,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAEzE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GACb,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,CAGrC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMrD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMvD;AAMD,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,GAAG,EAAE,MAAM,CAAC,GACX,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAChB,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE;KACrE,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAYjC;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,cAAc,EAAE,MAAM,GACrB,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,WAAW,EAAE,MAAM,EAAE,GACpB,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAGhC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAEpD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,CAEnD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAEvD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAEpD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE,CAU7E;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,EAAE,EAC1B,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EACZ,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GACX,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAEtC;AAED,wBAAgB,gCAAgC,CAC9C,CAAC,EACD,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAA;CAAE,EAC9B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,CAYjD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAGlE"}
@@ -33,7 +33,13 @@ export function isObjectWithKeys(keys) {
33
33
  }
34
34
  export function isObjectWithKeysMatchingGuard(guards) {
35
35
  return (value) => typeof value === "object" &&
36
- Object.keys(guards).every((key) => key in value && guards[key](value[key]));
36
+ Object.keys(guards).filter((key) => {
37
+ const result = key in value && guards[key](value[key]);
38
+ if (!result) {
39
+ console.debug(`Guard not matched for object. Value of key ${key} did not pass the guard.`);
40
+ }
41
+ return result;
42
+ }).length === Object.keys(guards).length;
37
43
  }
38
44
  export function isExactString(expectedString) {
39
45
  return (value) => isString(value) && value === expectedString;
@@ -44,6 +50,9 @@ export function isOneStringOf(validValues) {
44
50
  export function always(value) {
45
51
  return true;
46
52
  }
53
+ export function never(value) {
54
+ return false;
55
+ }
47
56
  export function isBool(value) {
48
57
  return typeof value === "boolean";
49
58
  }
@@ -51,8 +60,28 @@ export function isNull(value) {
51
60
  return value === null;
52
61
  }
53
62
  export function isListOf(guard) {
54
- return (value) => Array.isArray(value) && value.every(guard);
63
+ return (value) => Array.isArray(value) &&
64
+ value.filter((item, index) => {
65
+ const result = guard(item);
66
+ if (!result) {
67
+ console.debug(`Guard not matched for item ${index} of list.`);
68
+ }
69
+ return result;
70
+ }).length === value.length;
55
71
  }
56
72
  export function oneOf(a, b) {
57
73
  return (value) => a(value) || b(value);
58
74
  }
75
+ export function isObjectWithAllKeysMatchingGuard(guard) {
76
+ return (value) => typeof value === "object" &&
77
+ Object.keys(value).filter((key) => {
78
+ const result = key in value && guard(value[key]);
79
+ if (!result) {
80
+ console.debug(`Guard not matched for object. Value of key ${key} did not pass the guard.`);
81
+ }
82
+ return result;
83
+ }).length === Object.keys(value).length;
84
+ }
85
+ export function isStringWithPattern(pattern) {
86
+ return (value) => isString(value) && pattern.test(value);
87
+ }
@@ -0,0 +1,5 @@
1
+ import { Persistence } from "@kaumlaut/pure/runtime/persistence";
2
+ import { Message } from "@kaumlaut/pure/runtime";
3
+ import { Cloneable } from "@kaumlaut/pure/clone";
4
+ export declare const localStoragePersistence: <Model extends Cloneable, CustomMessage extends Message>(name: string) => Persistence<Model, CustomMessage>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/runtime/persistence/localStorage/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAChE,OAAO,EAAE,OAAO,EAAQ,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAIhD,eAAO,MAAM,uBAAuB,GAAI,KAAK,SAAS,SAAS,EAAE,aAAa,SAAS,OAAO,EAC5F,MAAM,MAAM,KACX,WAAW,CAAC,KAAK,EAAE,aAAa,CAwBjC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { ok, err } from "@kaumlaut/pure/result";
2
+ import { just, nothing } from "@kaumlaut/pure/maybe";
3
+ export const localStoragePersistence = (name) => ({
4
+ persist(model) {
5
+ window.localStorage.setItem(name, btoa(JSON.stringify(model)));
6
+ },
7
+ read(guard, init) {
8
+ const record = window.localStorage.getItem(name);
9
+ if (record === null) {
10
+ return ok(init(nothing())[0]);
11
+ }
12
+ try {
13
+ const json = atob(record);
14
+ const model = JSON.parse(json);
15
+ if (guard(model)) {
16
+ return ok(init(just(model))[0]);
17
+ }
18
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
19
+ }
20
+ catch (e) {
21
+ return err('Could not decode stored model');
22
+ }
23
+ return err('Your guard did not match the retrieved model');
24
+ },
25
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaumlaut/pure",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Types and functions for a state runtime inspired by Elm and functional programming",
5
5
  "author": "Max Kaemmerer",
6
6
  "license": "MIT",
@@ -37,4 +37,4 @@
37
37
  "typescript-eslint": "^8.26.1",
38
38
  "vitest": "^3.0.8"
39
39
  }
40
- }
40
+ }