@kaumlaut/pure 0.1.7 → 0.1.8

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.
@@ -1,6 +1,6 @@
1
- import type { Guard } from '../guard/Guard';
2
- import type { Message } from '../runtime/Runtime';
3
- import { type Effect, type ReceiveEffectResult } from './Effect';
1
+ import { ReceiveEffectResult, Effect } from '.';
2
+ import type { Guard } from '../guard';
3
+ import type { Message } from '../runtime';
4
4
  type HttpError = {
5
5
  code: number;
6
6
  message: string;
@@ -1,5 +1,5 @@
1
- import { err, ok } from '../result/Result';
2
- import { effectWithName } from './Effect';
1
+ import { effectWithName } from '.';
2
+ import { err, ok } from '../result';
3
3
  export function isNotFound(error) {
4
4
  return isHttp(error) && error.code === 404;
5
5
  }
@@ -1,2 +1,2 @@
1
- import { type Effect } from './Effect';
1
+ import { type Effect } from '.';
2
2
  export declare function none(): Effect<any>;
@@ -1,4 +1,4 @@
1
- import { effectWithName } from './Effect';
1
+ import { effectWithName } from '.';
2
2
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
3
  export function none() {
4
4
  return effectWithName('none', () => {
@@ -1,4 +1,16 @@
1
- export * from "./Effect";
2
1
  export * from "./Fetch";
3
2
  export * from "./None";
4
- export type { Effect, AsyncEffect, AsyncNullEffect, EffectType, NullEffect, ReceiveEffectResult, SyncEffect } from "./Effect";
3
+ import type { Result } from '../result';
4
+ import type { Message } from '../runtime';
5
+ export type AsyncEffect<T extends Message> = () => Promise<T>;
6
+ export type SyncEffect<T extends Message> = () => T;
7
+ export type NullEffect = () => null;
8
+ export type AsyncNullEffect = () => Promise<null>;
9
+ export type EffectType<T extends Message> = AsyncEffect<T> | SyncEffect<T> | NullEffect | AsyncNullEffect;
10
+ export type Effect<T extends Message> = {
11
+ effectType: EffectType<T>;
12
+ name: string;
13
+ meta: object | null;
14
+ };
15
+ export declare function effectWithName<T extends Message>(name: string, effect: EffectType<T>, meta?: object | null): Effect<T>;
16
+ export type ReceiveEffectResult<T, E, R> = (result: Result<T, E>) => R;
@@ -1,3 +1,9 @@
1
- export * from "./Effect";
2
1
  export * from "./Fetch";
3
2
  export * from "./None";
3
+ export function effectWithName(name, effect, meta = null) {
4
+ return {
5
+ name,
6
+ effectType: effect,
7
+ meta,
8
+ };
9
+ }
@@ -1,2 +1 @@
1
- export * from "./Guard";
2
- export type { Guard } from "./Guard";
1
+ export type Guard<T> = (value: unknown) => value is T;
@@ -1 +1 @@
1
- export * from "./Guard";
1
+ export {};
@@ -1,2 +1,16 @@
1
- export * from "./Maybe";
2
- export type { Just, Maybe, Nothing } from "./Maybe";
1
+ export type Just<T> = {
2
+ type: 'maybe-just';
3
+ value: T;
4
+ };
5
+ export type Nothing = {
6
+ type: 'maybe-nothing';
7
+ };
8
+ export type Maybe<T> = Just<T> | Nothing;
9
+ export declare function nothing(): Nothing;
10
+ export declare function just<T>(value: T): Just<T>;
11
+ export declare function isNothing<T>(maybe: Maybe<T>): maybe is Nothing;
12
+ export declare function isJust<T>(maybe: Maybe<T>): maybe is Just<T>;
13
+ export declare function isMaybe<T>(value: unknown): value is Maybe<T>;
14
+ export declare function mapMaybe<T, R>(maybe: Maybe<T>, func: (value: T) => R): Maybe<R>;
15
+ export declare function filterMaybe<T>(maybe: Maybe<T>, func: (value: T) => boolean): Maybe<T>;
16
+ export declare function maybeWithDefault<T>(maybe: Maybe<T>, defaultValue: T): T;
@@ -1 +1,39 @@
1
- export * from "./Maybe";
1
+ export function nothing() {
2
+ return {
3
+ type: 'maybe-nothing',
4
+ };
5
+ }
6
+ export function just(value) {
7
+ return {
8
+ type: 'maybe-just',
9
+ value,
10
+ };
11
+ }
12
+ export function isNothing(maybe) {
13
+ return maybe.type === 'maybe-nothing';
14
+ }
15
+ export function isJust(maybe) {
16
+ return maybe.type === 'maybe-just';
17
+ }
18
+ export function isMaybe(value) {
19
+ //@ts-expect-error is validated
20
+ return value.type === 'maybe-just' || value.type === 'maybe-nothing';
21
+ }
22
+ export function mapMaybe(maybe, func) {
23
+ if (isJust(maybe)) {
24
+ return just(func(maybe.value));
25
+ }
26
+ return maybe;
27
+ }
28
+ export function filterMaybe(maybe, func) {
29
+ if (isJust(maybe) && func(maybe.value)) {
30
+ return maybe;
31
+ }
32
+ return nothing();
33
+ }
34
+ export function maybeWithDefault(maybe, defaultValue) {
35
+ if (isJust(maybe)) {
36
+ return maybe.value;
37
+ }
38
+ return defaultValue;
39
+ }
@@ -1 +1,3 @@
1
- export * from "./Parse";
1
+ import { type Result } from '../result';
2
+ export declare function asInt(value: string): Result<number, string>;
3
+ export declare function asFloat(value: string): Result<number, string>;
@@ -1 +1,15 @@
1
- export * from "./Parse";
1
+ import { err, ok } from '../result';
2
+ export function asInt(value) {
3
+ const parsed = parseInt(value, 10);
4
+ if (Number.isNaN(parsed)) {
5
+ return err('Number is NaN');
6
+ }
7
+ return ok(parsed);
8
+ }
9
+ export function asFloat(value) {
10
+ const parsed = parseFloat(value);
11
+ if (Number.isNaN(parsed)) {
12
+ return err('Number is NaN');
13
+ }
14
+ return ok(parsed);
15
+ }
@@ -1,2 +1,16 @@
1
- export * from "./Result";
2
- export type { Err, Ok, Result } from "./Result";
1
+ export type Ok<T> = {
2
+ type: 'ok-result';
3
+ value: T;
4
+ };
5
+ export type Err<T> = {
6
+ type: 'error-result';
7
+ error: T;
8
+ };
9
+ export type Result<T, E> = Ok<T> | Err<E>;
10
+ export declare function isOk<T, E>(result: Result<T, E>): result is Ok<T>;
11
+ export declare function isErr<T, E>(result: Result<T, E>): result is Err<E>;
12
+ export declare function ok<T>(value: T): Ok<T>;
13
+ export declare function err<E>(error: E): Err<E>;
14
+ export declare function map<T, E, R>(result: Result<T, E>, func: (value: T) => R): Result<R, E>;
15
+ export declare function mapErr<T, E, R>(result: Result<T, E>, func: (value: E) => R): Result<T, R>;
16
+ export declare function withDefault<T, E>(result: Result<T, E>, defaultValue: T): T;
@@ -1 +1,36 @@
1
- export * from "./Result";
1
+ export function isOk(result) {
2
+ return result.type === 'ok-result';
3
+ }
4
+ export function isErr(result) {
5
+ return result.type === 'error-result';
6
+ }
7
+ export function ok(value) {
8
+ return {
9
+ type: 'ok-result',
10
+ value,
11
+ };
12
+ }
13
+ export function err(error) {
14
+ return {
15
+ type: 'error-result',
16
+ error,
17
+ };
18
+ }
19
+ export function map(result, func) {
20
+ if (isOk(result)) {
21
+ return ok(func(result.value));
22
+ }
23
+ return result;
24
+ }
25
+ export function mapErr(result, func) {
26
+ if (isErr(result)) {
27
+ return err(func(result.error));
28
+ }
29
+ return result;
30
+ }
31
+ export function withDefault(result, defaultValue) {
32
+ if (isErr(result)) {
33
+ return defaultValue;
34
+ }
35
+ return result.value;
36
+ }
@@ -1,3 +1,19 @@
1
- export * from "./Runtime";
1
+ import type { Effect } from '../effect';
2
2
  export * from "./persistence";
3
- export type { Change, Changes, Init, Message, Update } from "./Runtime";
3
+ export type Message<N extends string = string, T = any> = {
4
+ value: T;
5
+ name: N;
6
+ };
7
+ export type Update<Model, CustomMessage extends Message> = (model: Model, msg: CustomMessage) => [Model, Effect<CustomMessage>];
8
+ export type Init<Model, CustomMessage extends Message> = () => [Model, Effect<CustomMessage>];
9
+ export type Change<CustomMessage extends Message, Model> = [
10
+ CustomMessage | null,
11
+ model: Model,
12
+ effect: {
13
+ name: string;
14
+ meta: object | null;
15
+ } | null
16
+ ];
17
+ export type Changes<CustomMessage extends Message, Model> = Change<CustomMessage, Model>[];
18
+ export declare function is<CustomMessage extends Message<A>, A extends string>(name: A, message: Message): message is CustomMessage;
19
+ export declare function create<MN extends string, T>(name: MN, value: T): Message<MN, T>;
@@ -1,2 +1,10 @@
1
- export * from "./Runtime";
2
1
  export * from "./persistence";
2
+ export function is(name, message) {
3
+ return message.name === name;
4
+ }
5
+ export function create(name, value) {
6
+ return {
7
+ name,
8
+ value
9
+ };
10
+ }
@@ -1,3 +1,3 @@
1
- import type { Message } from '../Runtime';
2
- import type { Persistence } from './Persistence';
1
+ import type { Message } from '..';
2
+ import type { Persistence } from '.';
3
3
  export declare const localStoragePersistence: <Model, CustomMessage extends Message>(name: string) => Persistence<Model, CustomMessage>;
@@ -1,4 +1,4 @@
1
- import { err, ok } from '../../result/Result';
1
+ import { err, ok } from '../../result';
2
2
  export const localStoragePersistence = (name) => ({
3
3
  persist(model) {
4
4
  window.localStorage.setItem(name, btoa(JSON.stringify(model)));
@@ -1,3 +1,3 @@
1
- import type { Message } from '../Runtime';
2
- import type { Persistence } from './Persistence';
1
+ import type { Message } from '..';
2
+ import type { Persistence } from '.';
3
3
  export declare const noPersistence: <Model, CustomMessage extends Message>() => Persistence<Model, CustomMessage>;
@@ -1,4 +1,4 @@
1
- import { ok } from '../../result/Result';
1
+ import { ok } from '../../result';
2
2
  export const noPersistence = () => ({
3
3
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
4
4
  persist(model) { },
@@ -1,4 +1,4 @@
1
- import type { Guard } from '../../guard/Guard';
1
+ import type { Guard } from '../../guard';
2
2
  import type { Result } from '../../result/Result';
3
3
  import type { Init, Message } from '../Runtime';
4
4
  export type Persistence<Model, CustomMessage extends Message> = {
@@ -1,3 +1,9 @@
1
+ import { Guard } from "../../guard";
2
+ import { Result } from "../../result";
3
+ import { Message, Init } from "..";
1
4
  export * from "./LocalStorage";
2
5
  export * from "./None";
3
- export type { Persistence } from "./Persistence";
6
+ export type Persistence<Model, CustomMessage extends Message> = {
7
+ persist(model: Model): void;
8
+ read(guard: Guard<Model>, init: Init<Model, CustomMessage>): Result<Model, string>;
9
+ };
package/package.json CHANGED
@@ -1,48 +1,33 @@
1
1
  {
2
2
  "name": "@kaumlaut/pure",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Types and functions for state management inspired by Elm and functional programming",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "module": "dist/index.js",
8
+ "markdown": "standard",
9
+ "readme": "docs/README.md",
8
10
  "scripts": {
9
11
  "build": "tsc",
10
12
  "test": "vitest",
13
+ "typedoc": "typedoc",
11
14
  "release": "npm run build && npm publish --access public"
12
15
  },
13
16
  "files": [
14
17
  "dist"
15
18
  ],
16
19
  "exports": {
17
- "./effect": {
18
- "import": "./dist/effect/index.js",
19
- "types": "./dist/effect/index.d.ts"
20
- },
21
- "./result": {
22
- "import": "./dist/result/index.js",
23
- "types": "./dist/result/index.d.ts"
24
- },
25
- "./runtime": {
26
- "import": "./dist/runtime/index.js",
27
- "types": "./dist/runtime/index.d.ts"
28
- },
29
- "./maybe": {
30
- "import": "./dist/maybe/index.js",
31
- "types": "./dist/maybe/index.d.ts"
32
- },
33
- "./guard": {
34
- "import": "./dist/guard/index.js",
35
- "types": "./dist/guard/index.d.ts"
36
- },
37
- "./parse": {
38
- "import": "./dist/parse/index.js",
39
- "types": "./dist/parse/index.d.ts"
20
+ "./*": {
21
+ "import": "./dist/*/index.js",
22
+ "types": "./dist/*/index.d.ts"
40
23
  }
41
24
  },
42
25
  "type": "module",
43
26
  "author": "Max Kaemmerer",
44
27
  "license": "MIT",
45
28
  "devDependencies": {
29
+ "typedoc": "^0.27.9",
30
+ "typedoc-plugin-markdown": "^4.4.2",
46
31
  "typescript": "^5.8.2",
47
32
  "vitest": "^3.0.8"
48
33
  }