@soundscript/soundscript 0.1.1 → 0.1.3
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.
- package/README.md +1 -1
- package/async.d.ts +3 -3
- package/async.js +2 -2
- package/async.js.map +1 -1
- package/codec.d.ts +3 -2
- package/codec.js +2 -2
- package/codec.js.map +1 -1
- package/compare.js +5 -10
- package/compare.js.map +1 -1
- package/decode.d.ts +6 -4
- package/decode.js +5 -5
- package/decode.js.map +1 -1
- package/derive.d.ts +6 -0
- package/derive.js +8 -0
- package/derive.js.map +1 -0
- package/encode.d.ts +11 -9
- package/encode.js +5 -5
- package/encode.js.map +1 -1
- package/experimental/thunk.js.map +1 -0
- package/fetch.d.ts +67 -0
- package/fetch.js +6 -0
- package/fetch.js.map +1 -0
- package/hash.js +9 -14
- package/hash.js.map +1 -1
- package/json.d.ts +29 -2
- package/json.js +124 -1
- package/json.js.map +1 -1
- package/numerics.d.ts +523 -0
- package/numerics.js +1357 -0
- package/numerics.js.map +1 -0
- package/package.json +122 -35
- package/random.d.ts +19 -0
- package/random.js +4 -0
- package/random.js.map +1 -0
- package/result.d.ts +21 -5
- package/result.js +55 -19
- package/result.js.map +1 -1
- package/soundscript/async.sts +7 -7
- package/soundscript/codec.sts +8 -7
- package/soundscript/compare.sts +5 -13
- package/soundscript/decode.sts +15 -13
- package/soundscript/derive.sts +7 -0
- package/soundscript/encode.sts +18 -16
- package/soundscript/fetch.sts +11 -0
- package/soundscript/hash.sts +9 -17
- package/soundscript/json.sts +209 -3
- package/soundscript/numerics.sts +1937 -0
- package/soundscript/random.sts +5 -0
- package/soundscript/result.sts +93 -24
- package/soundscript/text.sts +4 -0
- package/soundscript/typeclasses.sts +22 -16
- package/soundscript/url.sts +4 -0
- package/soundscript/value.sts +133 -0
- package/text.d.ts +24 -0
- package/text.js +4 -0
- package/text.js.map +1 -0
- package/typeclasses.d.ts +2 -2
- package/typeclasses.js +10 -9
- package/typeclasses.js.map +1 -1
- package/url.d.ts +37 -0
- package/url.js +4 -0
- package/url.js.map +1 -0
- package/value.d.ts +9 -0
- package/value.js +105 -0
- package/value.js.map +1 -0
- package/experimental/component.d.ts +0 -40
- package/experimental/component.js +0 -46
- package/experimental/component.js.map +0 -1
- package/soundscript/experimental/component.sts +0 -69
- package/thunk.js.map +0 -1
- /package/{thunk.d.ts → experimental/thunk.d.ts} +0 -0
- /package/{thunk.js → experimental/thunk.js} +0 -0
- /package/soundscript/{thunk.sts → experimental/thunk.sts} +0 -0
package/README.md
CHANGED
|
@@ -6,5 +6,5 @@ This package provides:
|
|
|
6
6
|
|
|
7
7
|
- the `soundscript` CLI launcher
|
|
8
8
|
- stable runtime and TypeScript interop modules under `@soundscript/soundscript/*`
|
|
9
|
-
-
|
|
9
|
+
- source-published `.sts` modules and declarations for checker/editor package discovery
|
|
10
10
|
- the canonical package identity for built Soundscript libraries
|
package/async.d.ts
CHANGED
|
@@ -54,15 +54,15 @@ export function flatMap<A, B, E1, E2>(
|
|
|
54
54
|
): Task<B, E1 | E2>;
|
|
55
55
|
export function recover<A, B, E>(
|
|
56
56
|
task: Task<A, E>,
|
|
57
|
-
project: (error: E) => B |
|
|
57
|
+
project: (error: E) => B | Promise<B>,
|
|
58
58
|
): Task<A | B, Error>;
|
|
59
59
|
export function tap<A, E>(
|
|
60
60
|
task: Task<A, E>,
|
|
61
|
-
effect: (value: A) => unknown |
|
|
61
|
+
effect: (value: A) => unknown | Promise<unknown>,
|
|
62
62
|
): Task<A, E | Error>;
|
|
63
63
|
export function tapError<A, E>(
|
|
64
64
|
task: Task<A, E>,
|
|
65
|
-
effect: (error: E) => unknown |
|
|
65
|
+
effect: (error: E) => unknown | Promise<unknown>,
|
|
66
66
|
): Task<A, E | Error>;
|
|
67
67
|
export function parallel<T, E>(tasks: readonly Task<T, E>[]): Task<readonly T[], E>;
|
|
68
68
|
export function race<T, E>(
|
package/async.js
CHANGED
|
@@ -181,7 +181,7 @@ export function taskAsyncMonad() {
|
|
|
181
181
|
return {
|
|
182
182
|
...monad,
|
|
183
183
|
fromPromise(promise) {
|
|
184
|
-
return fromPromise(() =>
|
|
184
|
+
return fromPromise(() => promise);
|
|
185
185
|
},
|
|
186
186
|
};
|
|
187
187
|
}
|
|
@@ -208,7 +208,7 @@ export const promiseMonad = {
|
|
|
208
208
|
export const promiseAsyncMonad = {
|
|
209
209
|
...promiseMonad,
|
|
210
210
|
fromPromise(promise) {
|
|
211
|
-
return
|
|
211
|
+
return promise;
|
|
212
212
|
},
|
|
213
213
|
};
|
|
214
214
|
//# sourceMappingURL=async.js.map
|
package/async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","sourceRoot":"","sources":["./soundscript/async.sts"],"names":[],"mappings":"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","sourcesContent":["import { type Bind, type Kind2, type TypeLambda } from '@soundscript/soundscript/hkt';\nimport { Failure, normalizeThrown } from '@soundscript/soundscript/failures';\nimport { err, isErr, ok, type Result, resultOf } from '@soundscript/soundscript/result';\nimport { type Applicative, type AsyncMonad, type Functor, type Monad } from '@soundscript/soundscript/typeclasses';\n\nexport interface AbortSignalLike {\n readonly aborted: boolean;\n readonly reason?: unknown;\n addEventListener(\n type: 'abort',\n listener: () => void,\n options?: boolean | { once?: boolean },\n ): void;\n removeEventListener(type: 'abort', listener: () => void, options?: boolean): void;\n}\n\nexport type Task<T, E = Error> = (signal?: AbortSignalLike) => Promise<Result<T, E>>;\n\nexport interface TaskF extends TypeLambda {\n readonly type: Task<this['Args'][1], this['Args'][0]>;\n}\n\nexport interface PromiseF extends TypeLambda {\n readonly type: Promise<this['Args'][0]>;\n}\n\nexport type TaskKind<E, T> = Kind2<TaskF, E, T>;\nexport type PromiseKind<T> = Promise<T>;\n\nexport class TimeoutFailure extends Failure {\n readonly ms: number;\n\n constructor(ms: number, cause?: unknown) {\n super(`Task timed out after ${ms}ms.`, { cause });\n this.ms = ms;\n }\n}\n\nexport function succeed<T>(value: T): Task<T, never> {\n return () => Promise.resolve(ok(value));\n}\n\nexport function fail<E>(error: E): Task<never, E> {\n return () => Promise.resolve(err(error));\n}\n\nexport function fromResult<T, E>(result: Result<T, E>): Task<T, E> {\n return () => Promise.resolve(result);\n}\n\nexport function fromPromise<T>(fn: (signal?: AbortSignalLike) => Promise<T>): Task<T, Error>;\nexport function fromPromise<T, E>(\n fn: (signal?: AbortSignalLike) => Promise<T>,\n mapError: (error: Error) => E,\n): Task<T, E>;\nexport function fromPromise<T, E>(\n fn: (signal?: AbortSignalLike) => Promise<T>,\n mapError?: (error: Error) => E,\n): Task<T, E | Error> {\n return async (signal?: AbortSignalLike) => {\n if (mapError) {\n return await resultOf(() => fn(signal), mapError);\n }\n\n return await resultOf(() => fn(signal));\n };\n}\n\nexport function map<A, B, E>(\n task: Task<A, E>,\n project: (value: A) => B,\n): Task<B, E> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n return isErr(result) ? result : ok(project(result.value));\n };\n}\n\nexport function mapError<A, E1, E2>(\n task: Task<A, E1>,\n project: (error: E1) => E2,\n): Task<A, E2 | Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (!isErr(result)) {\n return result;\n }\n\n try {\n return err(project(result.error));\n } catch (error) {\n return err(normalizeThrown(error));\n }\n };\n}\n\nexport function flatMap<A, B, E1, E2>(\n task: Task<A, E1>,\n project: (value: A) => Task<B, E2>,\n): Task<B, E1 | E2> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (isErr(result)) {\n return result;\n }\n return await project(result.value)(signal);\n };\n}\n\nexport function recover<A, B, E>(\n task: Task<A, E>,\n project: (error: E) => B | PromiseLike<B>,\n): Task<A | B, Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (!isErr(result)) {\n return result;\n }\n\n return await resultOf(async () => await project(result.error));\n };\n}\n\nexport function tap<A, E>(\n task: Task<A, E>,\n effect: (value: A) => unknown | PromiseLike<unknown>,\n): Task<A, E | Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (isErr(result)) {\n return result;\n }\n\n const observed = await resultOf(async () => await effect(result.value));\n return isErr(observed) ? observed : result;\n };\n}\n\nexport function tapError<A, E>(\n task: Task<A, E>,\n effect: (error: E) => unknown | PromiseLike<unknown>,\n): Task<A, E | Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (!isErr(result)) {\n return result;\n }\n\n const observed = await resultOf(async () => await effect(result.error));\n return isErr(observed) ? observed : result;\n };\n}\n\nexport function parallel<T, E>(tasks: readonly Task<T, E>[]): Task<readonly T[], E> {\n return async (signal?: AbortSignalLike) => {\n const results = await Promise.all(tasks.map((task) => task(signal)));\n const values: T[] = [];\n for (const result of results) {\n if (isErr(result)) {\n return result;\n }\n values.push(result.value);\n }\n return ok(values);\n };\n}\n\nexport function race<T, E>(\n tasks: readonly [Task<T, E>, ...Task<T, E>[]],\n): Task<T, E> {\n return async (signal?: AbortSignalLike) => {\n const controller = new AbortController();\n const cleanup = forwardAbort(signal, controller);\n\n try {\n return await Promise.race(tasks.map(async (task) => {\n const result = await task(controller.signal);\n controller.abort(result);\n return result;\n }));\n } finally {\n cleanup();\n }\n };\n}\n\nexport function timeout<T, E>(task: Task<T, E>, ms: number): Task<T, E | TimeoutFailure> {\n return async (signal?: AbortSignalLike) => {\n const controller = new AbortController();\n const cleanup = forwardAbort(signal, controller);\n let timeoutId: number | undefined;\n\n try {\n const timeoutPromise = new Promise<Result<T, E | TimeoutFailure>>((resolve) => {\n timeoutId = setTimeout(() => {\n const failure = new TimeoutFailure(ms);\n resolve(err(failure));\n controller.abort(failure);\n }, ms);\n });\n\n return await Promise.race([\n task(controller.signal),\n timeoutPromise,\n ]);\n } finally {\n cleanup();\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\nfunction forwardAbort(\n signal: AbortSignalLike | undefined,\n controller: AbortController,\n): () => void {\n if (!signal) {\n return () => {};\n }\n\n if (signal.aborted) {\n controller.abort(signal.reason);\n return () => {};\n }\n\n const onAbort = (): void => {\n controller.abort(signal.reason);\n };\n\n signal.addEventListener('abort', onAbort, { once: true });\n return () => signal.removeEventListener('abort', onAbort);\n}\n\nfunction mapTask<E, A, B>(task: Task<A, E>, project: (value: A) => B): Task<B, E> {\n return map(task, project);\n}\n\nfunction apTask<E, A, B>(\n fn: Task<(value: A) => B, E>,\n value: Task<A, E>,\n): Task<B, E> {\n return flatMap(fn, (resolvedFn) => map(value, resolvedFn));\n}\n\nfunction flatMapTask<E, A, B>(\n task: Task<A, E>,\n project: (value: A) => Task<B, E>,\n): Task<B, E> {\n return flatMap(task, project);\n}\n\nfunction createTaskMonad<E>(): Monad<Bind<TaskF, [E]>> {\n return {\n ap: apTask,\n flatMap: flatMapTask,\n map: mapTask,\n pure: succeed,\n };\n}\n\nexport function taskFunctor<E>(): Functor<Bind<TaskF, [E]>> {\n return createTaskMonad<E>();\n}\n\nexport function taskApplicative<E>(): Applicative<Bind<TaskF, [E]>> {\n return createTaskMonad<E>();\n}\n\nexport function taskMonad<E>(): Monad<Bind<TaskF, [E]>> {\n return createTaskMonad<E>();\n}\n\nexport function taskAsyncMonad<E>(): AsyncMonad<Bind<TaskF, [E]>> {\n const monad = createTaskMonad<E>();\n return {\n ...monad,\n fromPromise<A>(promise: PromiseLike<A>): Task<A, E> {\n return fromPromise(() => Promise.resolve(promise)) as Task<A, E>;\n },\n };\n}\n\nexport const promiseFunctor: Functor<PromiseF> = {\n map<A, B>(value: Promise<A>, f: (value: A) => B): Promise<B> {\n return value.then(f);\n },\n};\n\nexport const promiseApplicative: Applicative<PromiseF> = {\n ...promiseFunctor,\n ap<A, B>(fn: Promise<(value: A) => B>, value: Promise<A>): Promise<B> {\n return Promise.all([fn, value]).then(([resolvedFn, resolvedValue]) =>\n resolvedFn(resolvedValue)\n );\n },\n pure<A>(value: A): Promise<A> {\n return Promise.resolve(value);\n },\n};\n\nexport const promiseMonad: Monad<PromiseF> = {\n ...promiseApplicative,\n flatMap<A, B>(value: Promise<A>, f: (value: A) => Promise<B>): Promise<B> {\n return value.then(f);\n },\n};\n\nexport const promiseAsyncMonad: AsyncMonad<PromiseF> = {\n ...promiseMonad,\n fromPromise<A>(promise: PromiseLike<A>): Promise<A> {\n return Promise.resolve(promise);\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["./soundscript/async.sts"],"names":[],"mappings":"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","sourcesContent":["import { type Bind, type Kind2, type TypeLambda } from '@soundscript/soundscript/hkt';\nimport { Failure, normalizeThrown } from '@soundscript/soundscript/failures';\nimport { err, isErr, ok, type Result, resultOf } from '@soundscript/soundscript/result';\nimport { type Applicative, type AsyncMonad, type Functor, type Monad } from '@soundscript/soundscript/typeclasses';\n\nexport interface AbortSignalLike {\n readonly aborted: boolean;\n readonly reason?: unknown;\n addEventListener(\n type: 'abort',\n listener: () => void,\n options?: boolean | { once?: boolean },\n ): void;\n removeEventListener(type: 'abort', listener: () => void, options?: boolean): void;\n}\n\nexport type Task<T, E = Error> = (signal?: AbortSignalLike) => Promise<Result<T, E>>;\n\nexport interface TaskF extends TypeLambda {\n readonly type: Task<this['Args'][1], this['Args'][0]>;\n}\n\nexport interface PromiseF extends TypeLambda {\n readonly type: Promise<this['Args'][0]>;\n}\n\nexport type TaskKind<E, T> = Kind2<TaskF, E, T>;\nexport type PromiseKind<T> = Promise<T>;\n\nexport class TimeoutFailure extends Failure {\n readonly ms: number;\n\n constructor(ms: number, cause?: unknown) {\n super(`Task timed out after ${ms}ms.`, { cause });\n this.ms = ms;\n }\n}\n\nexport function succeed<T>(value: T): Task<T, never> {\n return () => Promise.resolve(ok(value));\n}\n\nexport function fail<E>(error: E): Task<never, E> {\n return () => Promise.resolve(err(error));\n}\n\nexport function fromResult<T, E>(result: Result<T, E>): Task<T, E> {\n return () => Promise.resolve(result);\n}\n\nexport function fromPromise<T>(fn: (signal?: AbortSignalLike) => Promise<T>): Task<T, Error>;\nexport function fromPromise<T, E>(\n fn: (signal?: AbortSignalLike) => Promise<T>,\n mapError: (error: Error) => E,\n): Task<T, E>;\nexport function fromPromise<T, E>(\n fn: (signal?: AbortSignalLike) => Promise<T>,\n mapError?: (error: Error) => E,\n): Task<T, E | Error> {\n return async (signal?: AbortSignalLike) => {\n if (mapError) {\n return await resultOf(() => fn(signal), mapError);\n }\n\n return await resultOf(() => fn(signal));\n };\n}\n\nexport function map<A, B, E>(\n task: Task<A, E>,\n project: (value: A) => B,\n): Task<B, E> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n return isErr(result) ? result : ok(project(result.value));\n };\n}\n\nexport function mapError<A, E1, E2>(\n task: Task<A, E1>,\n project: (error: E1) => E2,\n): Task<A, E2 | Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (!isErr(result)) {\n return result;\n }\n\n try {\n return err(project(result.error));\n } catch (error) {\n return err(normalizeThrown(error));\n }\n };\n}\n\nexport function flatMap<A, B, E1, E2>(\n task: Task<A, E1>,\n project: (value: A) => Task<B, E2>,\n): Task<B, E1 | E2> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (isErr(result)) {\n return result;\n }\n return await project(result.value)(signal);\n };\n}\n\nexport function recover<A, B, E>(\n task: Task<A, E>,\n project: (error: E) => B | Promise<B>,\n): Task<A | B, Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (!isErr(result)) {\n return result;\n }\n\n return await resultOf(async () => await project(result.error));\n };\n}\n\nexport function tap<A, E>(\n task: Task<A, E>,\n effect: (value: A) => unknown | Promise<unknown>,\n): Task<A, E | Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (isErr(result)) {\n return result;\n }\n\n const observed = await resultOf(async () => await effect(result.value));\n return isErr(observed) ? observed : result;\n };\n}\n\nexport function tapError<A, E>(\n task: Task<A, E>,\n effect: (error: E) => unknown | Promise<unknown>,\n): Task<A, E | Error> {\n return async (signal?: AbortSignalLike) => {\n const result = await task(signal);\n if (!isErr(result)) {\n return result;\n }\n\n const observed = await resultOf(async () => await effect(result.error));\n return isErr(observed) ? observed : result;\n };\n}\n\nexport function parallel<T, E>(tasks: readonly Task<T, E>[]): Task<readonly T[], E> {\n return async (signal?: AbortSignalLike) => {\n const results = await Promise.all(tasks.map((task) => task(signal)));\n const values: T[] = [];\n for (const result of results) {\n if (isErr(result)) {\n return result;\n }\n values.push(result.value);\n }\n return ok(values);\n };\n}\n\nexport function race<T, E>(\n tasks: readonly [Task<T, E>, ...Task<T, E>[]],\n): Task<T, E> {\n return async (signal?: AbortSignalLike) => {\n const controller = new AbortController();\n const cleanup = forwardAbort(signal, controller);\n\n try {\n return await Promise.race(tasks.map(async (task) => {\n const result = await task(controller.signal);\n controller.abort(result);\n return result;\n }));\n } finally {\n cleanup();\n }\n };\n}\n\nexport function timeout<T, E>(task: Task<T, E>, ms: number): Task<T, E | TimeoutFailure> {\n return async (signal?: AbortSignalLike) => {\n const controller = new AbortController();\n const cleanup = forwardAbort(signal, controller);\n let timeoutId: number | undefined;\n\n try {\n const timeoutPromise = new Promise<Result<T, E | TimeoutFailure>>((resolve) => {\n timeoutId = setTimeout(() => {\n const failure = new TimeoutFailure(ms);\n resolve(err(failure));\n controller.abort(failure);\n }, ms);\n });\n\n return await Promise.race([\n task(controller.signal),\n timeoutPromise,\n ]);\n } finally {\n cleanup();\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\nfunction forwardAbort(\n signal: AbortSignalLike | undefined,\n controller: AbortController,\n): () => void {\n if (!signal) {\n return () => {};\n }\n\n if (signal.aborted) {\n controller.abort(signal.reason);\n return () => {};\n }\n\n const onAbort = (): void => {\n controller.abort(signal.reason);\n };\n\n signal.addEventListener('abort', onAbort, { once: true });\n return () => signal.removeEventListener('abort', onAbort);\n}\n\nfunction mapTask<E, A, B>(task: Task<A, E>, project: (value: A) => B): Task<B, E> {\n return map(task, project);\n}\n\nfunction apTask<E, A, B>(\n fn: Task<(value: A) => B, E>,\n value: Task<A, E>,\n): Task<B, E> {\n return flatMap(fn, (resolvedFn) => map(value, resolvedFn));\n}\n\nfunction flatMapTask<E, A, B>(\n task: Task<A, E>,\n project: (value: A) => Task<B, E>,\n): Task<B, E> {\n return flatMap(task, project);\n}\n\nfunction createTaskMonad<E>(): Monad<Bind<TaskF, [E]>> {\n return {\n ap: apTask,\n flatMap: flatMapTask,\n map: mapTask,\n pure: succeed,\n };\n}\n\nexport function taskFunctor<E>(): Functor<Bind<TaskF, [E]>> {\n return createTaskMonad<E>();\n}\n\nexport function taskApplicative<E>(): Applicative<Bind<TaskF, [E]>> {\n return createTaskMonad<E>();\n}\n\nexport function taskMonad<E>(): Monad<Bind<TaskF, [E]>> {\n return createTaskMonad<E>();\n}\n\nexport function taskAsyncMonad<E>(): AsyncMonad<Bind<TaskF, [E]>> {\n const monad = createTaskMonad<E>();\n return {\n ...monad,\n fromPromise<A>(promise: Promise<A>): Task<A, E> {\n return fromPromise(() => promise) as Task<A, E>;\n },\n };\n}\n\nexport const promiseFunctor: Functor<PromiseF> = {\n map<A, B>(value: Promise<A>, f: (value: A) => B): Promise<B> {\n return value.then(f);\n },\n};\n\nexport const promiseApplicative: Applicative<PromiseF> = {\n ...promiseFunctor,\n ap<A, B>(fn: Promise<(value: A) => B>, value: Promise<A>): Promise<B> {\n return Promise.all([fn, value]).then(([resolvedFn, resolvedValue]) =>\n resolvedFn(resolvedValue)\n );\n },\n pure<A>(value: A): Promise<A> {\n return Promise.resolve(value);\n },\n};\n\nexport const promiseMonad: Monad<PromiseF> = {\n ...promiseApplicative,\n flatMap<A, B>(value: Promise<A>, f: (value: A) => Promise<B>): Promise<B> {\n return value.then(f);\n },\n};\n\nexport const promiseAsyncMonad: AsyncMonad<PromiseF> = {\n ...promiseMonad,\n fromPromise<A>(promise: Promise<A>): Promise<A> {\n return promise;\n },\n};\n"]}
|
package/codec.d.ts
CHANGED
|
@@ -6,8 +6,9 @@ import type { Invariant } from '@soundscript/soundscript/typeclasses';
|
|
|
6
6
|
export { booleanEncoder, contramap, numberEncoder, stringEncoder } from '@soundscript/soundscript/encode';
|
|
7
7
|
export type { EncodeFailure, Encoder } from '@soundscript/soundscript/encode';
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
// #[variance(T: inout, TEncoded: out, DE: out, EE: out)]
|
|
10
|
+
export type Codec<T, TEncoded = unknown, DE = DecodeFailure, EE = EncodeFailure> =
|
|
11
|
+
Decoder<T, DE> & Encoder<T, TEncoded, EE>;
|
|
11
12
|
|
|
12
13
|
export interface CodecF extends TypeLambda {
|
|
13
14
|
readonly type: Codec<this['Args'][3], this['Args'][2], this['Args'][1], this['Args'][0]>;
|
package/codec.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { boolean as booleanDecoder, number as numberDecoder, string as stringDecoder, } from '@soundscript/soundscript/decode';
|
|
2
2
|
import { booleanEncoder as booleanEncoderValue, contramap as contramapEncoder, numberEncoder as numberEncoderValue, stringEncoder as stringEncoderValue, } from '@soundscript/soundscript/encode';
|
|
3
|
-
import { ok } from '@soundscript/soundscript/result';
|
|
3
|
+
import { isErr, ok } from '@soundscript/soundscript/result';
|
|
4
4
|
export { booleanEncoderValue as booleanEncoder, contramapEncoder as contramap, numberEncoderValue as numberEncoder, stringEncoderValue as stringEncoder, };
|
|
5
5
|
export function codec(decoder, encoder) {
|
|
6
6
|
return {
|
|
@@ -16,7 +16,7 @@ export function imap(base, decodeMap, encodeMap) {
|
|
|
16
16
|
return codec({
|
|
17
17
|
decode(value) {
|
|
18
18
|
const decoded = base.decode(value);
|
|
19
|
-
return decoded
|
|
19
|
+
return isErr(decoded) ? decoded : ok(decodeMap(decoded.value));
|
|
20
20
|
},
|
|
21
21
|
}, contramapEncoder(base, encodeMap));
|
|
22
22
|
}
|
package/codec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["./soundscript/codec.sts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,IAAI,cAAc,EAGzB,MAAM,IAAI,aAAa,EACvB,MAAM,IAAI,aAAa,GACxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,cAAc,IAAI,mBAAmB,EACrC,SAAS,IAAI,gBAAgB,EAG7B,aAAa,IAAI,kBAAkB,EACnC,aAAa,IAAI,kBAAkB,GACpC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["./soundscript/codec.sts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,IAAI,cAAc,EAGzB,MAAM,IAAI,aAAa,EACvB,MAAM,IAAI,aAAa,GACxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,cAAc,IAAI,mBAAmB,EACrC,SAAS,IAAI,gBAAgB,EAG7B,aAAa,IAAI,kBAAkB,EACnC,aAAa,IAAI,kBAAkB,GACpC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAe,MAAM,iCAAiC,CAAC;AAGzE,OAAO,EACL,mBAAmB,IAAI,cAAc,EACrC,gBAAgB,IAAI,SAAS,EAC7B,kBAAkB,IAAI,aAAa,EACnC,kBAAkB,IAAI,aAAa,GACpC,CAAC;AAUF,MAAM,UAAU,KAAK,CACnB,OAAuB,EACvB,OAAiC;IAEjC,OAAO;QACL,MAAM,CAAC,KAAK;YACV,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,KAAK;YACV,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAgC,EAChC,SAA0B,EAC1B,SAA0B;IAE1B,OAAO,KAAK,CACV;QACE,MAAM,CAAC,KAAK;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,CAAC;KACF,EACD,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAG5B,OAAO;QACL,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAA0B,KAAK,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAC3F,MAAM,CAAC,MAAM,WAAW,GAA0B,KAAK,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAC3F,MAAM,CAAC,MAAM,YAAY,GAA4B,KAAK,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC","sourcesContent":["import { type Bind, type TypeLambda } from '@soundscript/soundscript/hkt';\nimport {\n boolean as booleanDecoder,\n DecodeFailure,\n type Decoder,\n number as numberDecoder,\n string as stringDecoder,\n} from '@soundscript/soundscript/decode';\nimport {\n booleanEncoder as booleanEncoderValue,\n contramap as contramapEncoder,\n type EncodeFailure,\n type Encoder,\n numberEncoder as numberEncoderValue,\n stringEncoder as stringEncoderValue,\n} from '@soundscript/soundscript/encode';\nimport type { Invariant } from '@soundscript/soundscript/typeclasses';\nimport { isErr, ok, type Result } from '@soundscript/soundscript/result';\n\nexport type { EncodeFailure, Encoder } from '@soundscript/soundscript/encode';\nexport {\n booleanEncoderValue as booleanEncoder,\n contramapEncoder as contramap,\n numberEncoderValue as numberEncoder,\n stringEncoderValue as stringEncoder,\n};\n\n// #[variance(T: inout, TEncoded: out, DE: out, EE: out)]\nexport type Codec<T, TEncoded = unknown, DE = DecodeFailure, EE = EncodeFailure> =\n Decoder<T, DE> & Encoder<T, TEncoded, EE>;\n\nexport interface CodecF extends TypeLambda {\n readonly type: Codec<this['Args'][3], this['Args'][2], this['Args'][1], this['Args'][0]>;\n}\n\nexport function codec<T, TEncoded, DE, EE>(\n decoder: Decoder<T, DE>,\n encoder: Encoder<T, TEncoded, EE>,\n): Codec<T, TEncoded, DE, EE> {\n return {\n decode(value): Result<T, DE> {\n return decoder.decode(value);\n },\n encode(value): Result<TEncoded, EE> {\n return encoder.encode(value);\n },\n };\n}\n\nexport function imap<A, B, TEncoded, DE, EE>(\n base: Codec<A, TEncoded, DE, EE>,\n decodeMap: (value: A) => B,\n encodeMap: (value: B) => A,\n): Codec<B, TEncoded, DE, EE> {\n return codec(\n {\n decode(value): Result<B, DE> {\n const decoded = base.decode(value);\n return isErr(decoded) ? decoded : ok(decodeMap(decoded.value));\n },\n },\n contramapEncoder(base, encodeMap),\n );\n}\n\nexport function codecInvariant<TEncoded, DE = DecodeFailure, EE = EncodeFailure>(): Invariant<\n Bind<Bind<Bind<CodecF, [EE]>, [DE]>, [TEncoded]>\n> {\n return {\n imap,\n };\n}\n\nexport const stringCodec: Codec<string, string> = codec(stringDecoder, stringEncoderValue);\nexport const numberCodec: Codec<number, number> = codec(numberDecoder, numberEncoderValue);\nexport const booleanCodec: Codec<boolean, boolean> = codec(booleanDecoder, booleanEncoderValue);\n"]}
|
package/compare.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isErr, isNone, isOk, isSome } from '@soundscript/soundscript/result';
|
|
1
2
|
export const stringEq = {
|
|
2
3
|
equals(left, right) {
|
|
3
4
|
return left === right;
|
|
@@ -64,26 +65,20 @@ export function tupleEq(...elements) {
|
|
|
64
65
|
export function optionEq(itemEq) {
|
|
65
66
|
return {
|
|
66
67
|
equals(left, right) {
|
|
67
|
-
if (left
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
if (left.tag === 'ok' && right.tag === 'ok') {
|
|
68
|
+
if (isSome(left) && isSome(right)) {
|
|
71
69
|
return itemEq.equals(left.value, right.value);
|
|
72
70
|
}
|
|
73
|
-
return
|
|
71
|
+
return isNone(left) && isNone(right);
|
|
74
72
|
},
|
|
75
73
|
};
|
|
76
74
|
}
|
|
77
75
|
export function resultEq(okEq, errEq) {
|
|
78
76
|
return {
|
|
79
77
|
equals(left, right) {
|
|
80
|
-
if (left
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
if (left.tag === 'ok' && right.tag === 'ok') {
|
|
78
|
+
if (isOk(left) && isOk(right)) {
|
|
84
79
|
return okEq.equals(left.value, right.value);
|
|
85
80
|
}
|
|
86
|
-
if (left
|
|
81
|
+
if (isErr(left) && isErr(right)) {
|
|
87
82
|
return errEq.equals(left.error, right.error);
|
|
88
83
|
}
|
|
89
84
|
return false;
|
package/compare.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["./soundscript/compare.sts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["./soundscript/compare.sts"],"names":[],"mappings":"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","sourcesContent":["import { isErr, isNone, isOk, isSome, type Option, type Result } from '@soundscript/soundscript/result';\n\nexport type Ordering = -1 | 0 | 1;\n\nexport interface Eq<T> {\n equals(left: T, right: T): boolean;\n}\n\nexport interface Order<T> extends Eq<T> {\n compare(left: T, right: T): Ordering;\n}\n\ntype EqValue<TEq> = TEq extends Eq<infer TValue> ? TValue : never;\n\nexport const stringEq: Eq<string> = {\n equals(left, right) {\n return left === right;\n },\n};\n\nexport const numberEq: Eq<number> = {\n equals(left, right) {\n return left === right || (Number.isNaN(left) && Number.isNaN(right));\n },\n};\n\nexport const booleanEq: Eq<boolean> = {\n equals(left, right) {\n return left === right;\n },\n};\n\nexport const bigintEq: Eq<bigint> = {\n equals(left, right) {\n return left === right;\n },\n};\n\nexport function lazyEq<T>(getEq: () => Eq<T>): Eq<T> {\n return {\n equals(left, right) {\n return getEq().equals(left, right);\n },\n };\n}\n\nexport function arrayEq<T>(itemEq: Eq<T>): Eq<readonly T[]> {\n return {\n equals(left, right) {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (!itemEq.equals(left[index]!, right[index]!)) {\n return false;\n }\n }\n\n return true;\n },\n };\n}\n\nexport function tupleEq<const TEqs extends readonly Eq<unknown>[]>(\n ...elements: TEqs\n): Eq<{ readonly [K in keyof TEqs]: EqValue<TEqs[K]> }> {\n return {\n equals(left, right) {\n const leftValues = left as readonly unknown[];\n const rightValues = right as readonly unknown[];\n if (leftValues.length !== elements.length || rightValues.length !== elements.length) {\n return false;\n }\n\n for (let index = 0; index < elements.length; index += 1) {\n const elementEq = elements[index];\n if (!elementEq) {\n continue;\n }\n if (!elementEq.equals(leftValues[index], rightValues[index])) {\n return false;\n }\n }\n\n return true;\n },\n };\n}\n\nexport function optionEq<T>(itemEq: Eq<T>): Eq<Option<T>> {\n return {\n equals(left, right) {\n if (isSome(left) && isSome(right)) {\n return itemEq.equals(left.value, right.value);\n }\n\n return isNone(left) && isNone(right);\n },\n };\n}\n\nexport function resultEq<T, E>(okEq: Eq<T>, errEq: Eq<E>): Eq<Result<T, E>> {\n return {\n equals(left, right) {\n if (isOk(left) && isOk(right)) {\n return okEq.equals(left.value, right.value);\n }\n\n if (isErr(left) && isErr(right)) {\n return errEq.equals(left.error, right.error);\n }\n\n return false;\n },\n };\n}\n\nexport function fromCompare<T>(compare: (left: T, right: T) => number): Order<T> {\n return {\n equals(left, right) {\n return normalizeOrdering(compare(left, right)) === 0;\n },\n compare(left, right) {\n return normalizeOrdering(compare(left, right));\n },\n };\n}\n\nexport function reverse<T>(order: Order<T>): Order<T> {\n return fromCompare((left, right) => order.compare(right, left));\n}\n\nexport function thenBy<T>(primary: Order<T>, secondary: Order<T>): Order<T> {\n return fromCompare((left, right) => {\n const primaryOrdering = primary.compare(left, right);\n return primaryOrdering !== 0 ? primaryOrdering : secondary.compare(left, right);\n });\n}\n\nfunction normalizeOrdering(value: number): Ordering {\n if (value < 0) {\n return -1;\n }\n\n if (value > 0) {\n return 1;\n }\n\n return 0;\n}\n"]}
|
package/decode.d.ts
CHANGED
|
@@ -17,14 +17,16 @@ export class DecodeFailure extends Failure {
|
|
|
17
17
|
at(segment: DecodePathSegment): this;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
// #[variance(T: out, E: out)]
|
|
21
|
+
export type Decoder<T, E = DecodeFailure> = {
|
|
21
22
|
decode(value: unknown): Result<T, E>;
|
|
22
|
-
}
|
|
23
|
+
};
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
// #[variance(T: out, E: out)]
|
|
26
|
+
export type OptionalDecoder<T, E = DecodeFailure> = Decoder<T | undefined, E> & {
|
|
25
27
|
readonly __soundscriptOptional: true;
|
|
26
28
|
readonly inner: Decoder<T, E>;
|
|
27
|
-
}
|
|
29
|
+
};
|
|
28
30
|
|
|
29
31
|
type DecoderValue<TDecoder> = TDecoder extends Decoder<infer TValue, unknown> ? TValue : never;
|
|
30
32
|
type DecoderError<TDecoder> = TDecoder extends Decoder<unknown, infer E> ? E : never;
|
package/decode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Failure } from '@soundscript/soundscript/failures';
|
|
2
|
-
import { err, isErr, ok } from '@soundscript/soundscript/result';
|
|
2
|
+
import { err, isErr, none, ok, some } from '@soundscript/soundscript/result';
|
|
3
3
|
export class DecodeFailure extends Failure {
|
|
4
4
|
constructor(message = 'Failed to decode value.', options = {}) {
|
|
5
5
|
super(message, { cause: options.cause, trace: options.trace });
|
|
@@ -132,11 +132,11 @@ export function tuple(...elements) {
|
|
|
132
132
|
}
|
|
133
133
|
export function option(item) {
|
|
134
134
|
return union(map(object({
|
|
135
|
-
tag: literal('
|
|
135
|
+
tag: literal('some'),
|
|
136
136
|
value: item,
|
|
137
|
-
}), (value) =>
|
|
138
|
-
tag: literal('
|
|
139
|
-
}), () =>
|
|
137
|
+
}), (value) => some(value.value)), map(object({
|
|
138
|
+
tag: literal('none'),
|
|
139
|
+
}), () => none()));
|
|
140
140
|
}
|
|
141
141
|
export function result(okDecoder, errDecoder) {
|
|
142
142
|
return union(map(object({
|
package/decode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decode.js","sourceRoot":"","sources":["./soundscript/decode.sts"],"names":[],"mappings":"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","sourcesContent":["import { type ErrorFrame, Failure } from '@soundscript/soundscript/failures';\nimport { err, isErr, ok, type Option, type Result } from '@soundscript/soundscript/result';\n\nexport type DecodePathSegment = string | number;\nexport type DecodePath = readonly DecodePathSegment[];\n\nexport class DecodeFailure extends Failure {\n readonly path: DecodePath;\n\n constructor(\n message = 'Failed to decode value.',\n options: {\n cause?: unknown;\n path?: DecodePath;\n trace?: readonly ErrorFrame[];\n } = {},\n ) {\n super(message, { cause: options.cause, trace: options.trace });\n this.path = options.path ?? [];\n }\n\n at(segment: DecodePathSegment): this {\n const prototype = Object.getPrototypeOf(this as object);\n const clone = (prototype === null ? Object.create(null) : Object.create(prototype)) as this;\n Object.defineProperties(clone, Object.getOwnPropertyDescriptors(this));\n Object.defineProperty(clone, 'path', {\n configurable: true,\n enumerable: true,\n writable: false,\n value: [segment, ...this.path],\n });\n return clone;\n }\n}\n\nexport interface Decoder<T, E = DecodeFailure> {\n decode(value: unknown): Result<T, E>;\n}\n\nexport interface OptionalDecoder<T, E = DecodeFailure> extends Decoder<T | undefined, E> {\n readonly __soundscriptOptional: true;\n readonly inner: Decoder<T, E>;\n}\n\ntype DecoderValue<TDecoder> = TDecoder extends Decoder<infer TValue, unknown> ? TValue : never;\ntype DecoderError<TDecoder> = TDecoder extends Decoder<unknown, infer E> ? E : never;\n\ntype ObjectShape = Record<string, Decoder<unknown, unknown>>;\ntype TupleShape = readonly Decoder<unknown, unknown>[];\n\nexport const string: Decoder<string> = {\n decode(value) {\n return typeof value === 'string'\n ? ok(value)\n : err(new DecodeFailure('Expected string.', { cause: value }));\n },\n};\n\nexport const number: Decoder<number> = {\n decode(value) {\n return typeof value === 'number'\n ? ok(value)\n : err(new DecodeFailure('Expected number.', { cause: value }));\n },\n};\n\nexport const boolean: Decoder<boolean> = {\n decode(value) {\n return typeof value === 'boolean'\n ? ok(value)\n : err(new DecodeFailure('Expected boolean.', { cause: value }));\n },\n};\n\nexport const bigint: Decoder<bigint> = {\n decode(value) {\n if (typeof value === 'bigint') {\n return ok(value);\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) && Number.isSafeInteger(value)\n ? ok(BigInt(value))\n : err(new DecodeFailure('Expected bigint.', { cause: value }));\n }\n\n if (typeof value === 'string') {\n try {\n return ok(BigInt(value));\n } catch {\n return err(new DecodeFailure('Expected bigint.', { cause: value }));\n }\n }\n\n return err(new DecodeFailure('Expected bigint.', { cause: value }));\n },\n};\n\nexport function lazy<T, E>(getDecoder: () => Decoder<T, E>): Decoder<T, E> {\n return {\n decode(value) {\n return getDecoder().decode(value);\n },\n };\n}\n\nexport function optional<T, E>(decoder: Decoder<T, E>): OptionalDecoder<T, E> {\n return {\n __soundscriptOptional: true,\n inner: decoder,\n decode(value) {\n return value === undefined ? ok(undefined) : decoder.decode(value);\n },\n };\n}\n\nexport function literal<const T extends string | number | boolean | null>(value: T): Decoder<T> {\n return {\n decode(input) {\n return Object.is(input, value)\n ? ok(value)\n : err(new DecodeFailure(`Expected literal ${JSON.stringify(value)}.`, { cause: input }));\n },\n };\n}\n\nexport function array<T, E>(item: Decoder<T, E>): Decoder<readonly T[], E | DecodeFailure> {\n return {\n decode(value) {\n if (!Array.isArray(value)) {\n return err(new DecodeFailure('Expected array.', { cause: value }));\n }\n\n const decodedValues: T[] = [];\n for (let index = 0; index < value.length; index += 1) {\n const decoded = item.decode(value[index]);\n if (isErr(decoded)) {\n return err(prependPathIfPossible(decoded.error, index));\n }\n decodedValues.push(decoded.value);\n }\n\n return ok(decodedValues);\n },\n };\n}\n\nexport function tuple<const TElements extends TupleShape>(\n ...elements: TElements\n): Decoder<\n { readonly [K in keyof TElements]: DecoderValue<TElements[K]> },\n DecoderError<TElements[number]> | DecodeFailure\n> {\n return {\n decode(value) {\n if (!Array.isArray(value)) {\n return err(new DecodeFailure('Expected tuple.', { cause: value }));\n }\n\n if (value.length !== elements.length) {\n return err(\n new DecodeFailure(`Expected tuple of length ${elements.length}.`, {\n cause: value,\n }),\n );\n }\n\n const decodedValues: unknown[] = [];\n for (let index = 0; index < elements.length; index += 1) {\n const elementDecoder = elements[index];\n if (!elementDecoder) {\n continue;\n }\n const decoded = elementDecoder.decode(value[index]);\n if (isErr(decoded)) {\n return err(\n prependPathIfPossible(decoded.error, index) as\n | DecoderError<TElements[number]>\n | DecodeFailure,\n );\n }\n decodedValues.push(decoded.value);\n }\n\n return ok(decodedValues as { readonly [K in keyof TElements]: DecoderValue<TElements[K]> });\n },\n };\n}\n\nexport function option<T, E>(item: Decoder<T, E>): Decoder<Option<T>, E | DecodeFailure> {\n return union(\n map(\n object({\n tag: literal('ok'),\n value: item,\n }),\n (value) => ok(value.value) as Option<T>,\n ),\n map(\n object({\n tag: literal('err'),\n }),\n () => err() as Option<T>,\n ),\n );\n}\n\nexport function result<T, EValue, EDecodeValue, EDecodeError>(\n okDecoder: Decoder<T, EDecodeValue>,\n errDecoder: Decoder<EValue, EDecodeError>,\n): Decoder<Result<T, EValue>, EDecodeValue | EDecodeError | DecodeFailure> {\n return union(\n map(\n object({\n tag: literal('ok'),\n value: okDecoder,\n }),\n (value) => ok(value.value) as Result<T, EValue>,\n ),\n map(\n object({\n tag: literal('err'),\n error: errDecoder,\n }),\n (value) => err(value.error) as Result<T, EValue>,\n ),\n );\n}\n\nexport function object<TShape extends ObjectShape>(\n shape: TShape,\n): Decoder<\n { readonly [K in keyof TShape]: DecoderValue<TShape[K]> },\n DecoderError<TShape[keyof TShape]> | DecodeFailure\n> {\n return {\n decode(value) {\n if (!isPlainObject(value)) {\n return err(new DecodeFailure('Expected object.', { cause: value }));\n }\n\n const record = value as Record<string, unknown>;\n const decodedObject: Record<string, unknown> = {};\n\n for (const key of Object.keys(shape)) {\n const decoder = shape[key];\n const hasKey = key in record;\n const rawValue = record[key];\n\n if (!hasKey || rawValue === undefined) {\n if (isOptionalDecoder(decoder)) {\n decodedObject[key] = undefined;\n continue;\n }\n\n return err(\n new DecodeFailure(`Missing field \"${key}\".`, {\n cause: value,\n path: [key],\n }),\n );\n }\n\n const decoded = decoder.decode(rawValue);\n if (isErr(decoded)) {\n return err(\n prependPathIfPossible(decoded.error, key) as\n | DecoderError<TShape[keyof TShape]>\n | DecodeFailure,\n );\n }\n\n decodedObject[key] = decoded.value;\n }\n\n return ok(decodedObject as { readonly [K in keyof TShape]: DecoderValue<TShape[K]> });\n },\n };\n}\n\nexport function field<K extends string, T, E>(\n key: K,\n decoder: Decoder<T, E>,\n): Decoder<T, E | DecodeFailure> {\n const shape = { [key]: decoder } as { readonly [P in K]: Decoder<T, E> };\n return map(object(shape), (value) => value[key]);\n}\n\nexport function optionalField<K extends string, T, E>(\n key: K,\n decoder: Decoder<T, E>,\n): Decoder<T | undefined, E | DecodeFailure> {\n const shape = { [key]: optional(decoder) } as {\n readonly [P in K]: OptionalDecoder<T, E>;\n };\n return map(object(shape), (value) => value[key]);\n}\n\nexport function union<A, B, ELeft, ERight>(\n left: Decoder<A, ELeft>,\n right: Decoder<B, ERight>,\n): Decoder<A | B, ELeft | ERight | DecodeFailure> {\n return {\n decode(value) {\n const leftDecoded = left.decode(value);\n if (isErr(leftDecoded)) {\n const rightDecoded = right.decode(value);\n if (isErr(rightDecoded)) {\n return err(\n new DecodeFailure('Expected one of the union members.', {\n cause: value,\n }),\n );\n }\n return rightDecoded;\n }\n return leftDecoded;\n },\n };\n}\n\nexport function map<A, B, E>(\n decoder: Decoder<A, E>,\n project: (value: A) => B,\n): Decoder<B, E> {\n return {\n decode(value) {\n const decoded = decoder.decode(value);\n return isErr(decoded) ? decoded : ok(project(decoded.value));\n },\n };\n}\n\nexport function andThen<A, B, E>(\n decoder: Decoder<A, E>,\n project: (value: A) => Decoder<B, E>,\n): Decoder<B, E> {\n return {\n decode(value) {\n const decoded = decoder.decode(value);\n return isErr(decoded) ? decoded : project(decoded.value).decode(valueOf(decoded));\n },\n };\n}\n\nexport function refine<A, B extends A, E>(\n decoder: Decoder<A, E>,\n predicate: (value: A) => value is B,\n message: string,\n): Decoder<B, E | DecodeFailure> {\n return {\n decode(value) {\n const decoded = decoder.decode(value);\n if (isErr(decoded)) {\n return decoded;\n }\n\n return predicate(decoded.value)\n ? ok(decoded.value)\n : err(new DecodeFailure(message, { cause: value }));\n },\n };\n}\n\nfunction prependPathIfPossible<E>(error: E, segment: DecodePathSegment): E | DecodeFailure {\n return error instanceof DecodeFailure ? error.at(segment) : error;\n}\n\nfunction isOptionalDecoder(\n value: Decoder<unknown, unknown>,\n): value is OptionalDecoder<unknown, unknown> {\n return '__soundscriptOptional' in value &&\n value.__soundscriptOptional === true;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction valueOf<T>(decoded: { readonly value: T }): T {\n return decoded.value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["./soundscript/decode.sts"],"names":[],"mappings":"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","sourcesContent":["import { type ErrorFrame, Failure } from '@soundscript/soundscript/failures';\nimport { err, isErr, none, ok, some, type Option, type Result } from '@soundscript/soundscript/result';\n\nexport type DecodePathSegment = string | number;\nexport type DecodePath = readonly DecodePathSegment[];\n\nexport class DecodeFailure extends Failure {\n readonly path: DecodePath;\n\n constructor(\n message = 'Failed to decode value.',\n options: {\n cause?: unknown;\n path?: DecodePath;\n trace?: readonly ErrorFrame[];\n } = {},\n ) {\n super(message, { cause: options.cause, trace: options.trace });\n this.path = options.path ?? [];\n }\n\n at(segment: DecodePathSegment): this {\n const prototype = Object.getPrototypeOf(this as object);\n const clone = (prototype === null ? Object.create(null) : Object.create(prototype)) as this;\n Object.defineProperties(clone, Object.getOwnPropertyDescriptors(this));\n Object.defineProperty(clone, 'path', {\n configurable: true,\n enumerable: true,\n writable: false,\n value: [segment, ...this.path],\n });\n return clone;\n }\n}\n\n// #[variance(T: out, E: out)]\nexport type Decoder<T, E = DecodeFailure> = {\n decode(value: unknown): Result<T, E>;\n};\n\n// #[variance(T: out, E: out)]\nexport type OptionalDecoder<T, E = DecodeFailure> = Decoder<T | undefined, E> & {\n readonly __soundscriptOptional: true;\n readonly inner: Decoder<T, E>;\n};\n\ntype DecoderValue<TDecoder> = TDecoder extends Decoder<infer TValue, unknown> ? TValue : never;\ntype DecoderError<TDecoder> = TDecoder extends Decoder<unknown, infer E> ? E : never;\n\ntype ObjectShape = Record<string, Decoder<unknown, unknown>>;\ntype TupleShape = readonly Decoder<unknown, unknown>[];\n\nexport const string: Decoder<string> = {\n decode(value): Result<string, DecodeFailure> {\n return typeof value === 'string'\n ? ok(value)\n : err(new DecodeFailure('Expected string.', { cause: value }));\n },\n};\n\nexport const number: Decoder<number> = {\n decode(value): Result<number, DecodeFailure> {\n return typeof value === 'number'\n ? ok(value)\n : err(new DecodeFailure('Expected number.', { cause: value }));\n },\n};\n\nexport const boolean: Decoder<boolean> = {\n decode(value): Result<boolean, DecodeFailure> {\n return typeof value === 'boolean'\n ? ok(value)\n : err(new DecodeFailure('Expected boolean.', { cause: value }));\n },\n};\n\nexport const bigint: Decoder<bigint> = {\n decode(value): Result<bigint, DecodeFailure> {\n if (typeof value === 'bigint') {\n return ok(value);\n }\n\n if (typeof value === 'number') {\n return Number.isInteger(value) && Number.isSafeInteger(value)\n ? ok(BigInt(value))\n : err(new DecodeFailure('Expected bigint.', { cause: value }));\n }\n\n if (typeof value === 'string') {\n try {\n return ok(BigInt(value));\n } catch {\n return err(new DecodeFailure('Expected bigint.', { cause: value }));\n }\n }\n\n return err(new DecodeFailure('Expected bigint.', { cause: value }));\n },\n};\n\nexport function lazy<T, E>(getDecoder: () => Decoder<T, E>): Decoder<T, E> {\n return {\n decode(value) {\n return getDecoder().decode(value);\n },\n };\n}\n\nexport function optional<T, E>(decoder: Decoder<T, E>): OptionalDecoder<T, E> {\n return {\n __soundscriptOptional: true,\n inner: decoder,\n decode(value) {\n return value === undefined ? ok(undefined) : decoder.decode(value);\n },\n };\n}\n\nexport function literal<const T extends string | number | boolean | null>(value: T): Decoder<T> {\n return {\n decode(input) {\n return Object.is(input, value)\n ? ok(value)\n : err(new DecodeFailure(`Expected literal ${JSON.stringify(value)}.`, { cause: input }));\n },\n };\n}\n\nexport function array<T, E>(item: Decoder<T, E>): Decoder<readonly T[], E | DecodeFailure> {\n return {\n decode(value) {\n if (!Array.isArray(value)) {\n return err(new DecodeFailure('Expected array.', { cause: value }));\n }\n\n const decodedValues: T[] = [];\n for (let index = 0; index < value.length; index += 1) {\n const decoded = item.decode(value[index]);\n if (isErr(decoded)) {\n return err(prependPathIfPossible(decoded.error, index));\n }\n decodedValues.push(decoded.value);\n }\n\n return ok(decodedValues);\n },\n };\n}\n\nexport function tuple<const TElements extends TupleShape>(\n ...elements: TElements\n): Decoder<\n { readonly [K in keyof TElements]: DecoderValue<TElements[K]> },\n DecoderError<TElements[number]> | DecodeFailure\n> {\n return {\n decode(value) {\n if (!Array.isArray(value)) {\n return err(new DecodeFailure('Expected tuple.', { cause: value }));\n }\n\n if (value.length !== elements.length) {\n return err(\n new DecodeFailure(`Expected tuple of length ${elements.length}.`, {\n cause: value,\n }),\n );\n }\n\n const decodedValues: unknown[] = [];\n for (let index = 0; index < elements.length; index += 1) {\n const elementDecoder = elements[index];\n if (!elementDecoder) {\n continue;\n }\n const decoded = elementDecoder.decode(value[index]);\n if (isErr(decoded)) {\n return err(\n prependPathIfPossible(decoded.error, index) as\n | DecoderError<TElements[number]>\n | DecodeFailure,\n );\n }\n decodedValues.push(decoded.value);\n }\n\n return ok(decodedValues as { readonly [K in keyof TElements]: DecoderValue<TElements[K]> });\n },\n };\n}\n\nexport function option<T, E>(item: Decoder<T, E>): Decoder<Option<T>, E | DecodeFailure> {\n return union(\n map(\n object({\n tag: literal('some'),\n value: item,\n }),\n (value) => some(value.value) as Option<T>,\n ),\n map(\n object({\n tag: literal('none'),\n }),\n () => none() as Option<T>,\n ),\n );\n}\n\nexport function result<T, EValue, EDecodeValue, EDecodeError>(\n okDecoder: Decoder<T, EDecodeValue>,\n errDecoder: Decoder<EValue, EDecodeError>,\n): Decoder<Result<T, EValue>, EDecodeValue | EDecodeError | DecodeFailure> {\n return union(\n map(\n object({\n tag: literal('ok'),\n value: okDecoder,\n }),\n (value) => ok(value.value) as Result<T, EValue>,\n ),\n map(\n object({\n tag: literal('err'),\n error: errDecoder,\n }),\n (value) => err(value.error) as Result<T, EValue>,\n ),\n );\n}\n\nexport function object<TShape extends ObjectShape>(\n shape: TShape,\n): Decoder<\n { readonly [K in keyof TShape]: DecoderValue<TShape[K]> },\n DecoderError<TShape[keyof TShape]> | DecodeFailure\n> {\n return {\n decode(value) {\n if (!isPlainObject(value)) {\n return err(new DecodeFailure('Expected object.', { cause: value }));\n }\n\n const record = value as Record<string, unknown>;\n const decodedObject: Record<string, unknown> = {};\n\n for (const key of Object.keys(shape)) {\n const decoder = shape[key];\n const hasKey = key in record;\n const rawValue = record[key];\n\n if (!hasKey || rawValue === undefined) {\n if (isOptionalDecoder(decoder)) {\n decodedObject[key] = undefined;\n continue;\n }\n\n return err(\n new DecodeFailure(`Missing field \"${key}\".`, {\n cause: value,\n path: [key],\n }),\n );\n }\n\n const decoded = decoder.decode(rawValue);\n if (isErr(decoded)) {\n return err(\n prependPathIfPossible(decoded.error, key) as\n | DecoderError<TShape[keyof TShape]>\n | DecodeFailure,\n );\n }\n\n decodedObject[key] = decoded.value;\n }\n\n return ok(decodedObject as { readonly [K in keyof TShape]: DecoderValue<TShape[K]> });\n },\n };\n}\n\nexport function field<K extends string, T, E>(\n key: K,\n decoder: Decoder<T, E>,\n): Decoder<T, E | DecodeFailure> {\n const shape = { [key]: decoder } as { readonly [P in K]: Decoder<T, E> };\n return map(object(shape), (value) => value[key]);\n}\n\nexport function optionalField<K extends string, T, E>(\n key: K,\n decoder: Decoder<T, E>,\n): Decoder<T | undefined, E | DecodeFailure> {\n const shape = { [key]: optional(decoder) } as {\n readonly [P in K]: OptionalDecoder<T, E>;\n };\n return map(object(shape), (value) => value[key]);\n}\n\nexport function union<A, B, ELeft, ERight>(\n left: Decoder<A, ELeft>,\n right: Decoder<B, ERight>,\n): Decoder<A | B, ELeft | ERight | DecodeFailure> {\n return {\n decode(value) {\n const leftDecoded = left.decode(value);\n if (isErr(leftDecoded)) {\n const rightDecoded = right.decode(value);\n if (isErr(rightDecoded)) {\n return err(\n new DecodeFailure('Expected one of the union members.', {\n cause: value,\n }),\n );\n }\n return rightDecoded;\n }\n return leftDecoded;\n },\n };\n}\n\nexport function map<A, B, E>(\n decoder: Decoder<A, E>,\n project: (value: A) => B,\n): Decoder<B, E> {\n return {\n decode(value) {\n const decoded = decoder.decode(value);\n return isErr(decoded) ? decoded : ok(project(decoded.value));\n },\n };\n}\n\nexport function andThen<A, B, E>(\n decoder: Decoder<A, E>,\n project: (value: A) => Decoder<B, E>,\n): Decoder<B, E> {\n return {\n decode(value) {\n const decoded = decoder.decode(value);\n return isErr(decoded) ? decoded : project(decoded.value).decode(valueOf(decoded));\n },\n };\n}\n\nexport function refine<A, B extends A, E>(\n decoder: Decoder<A, E>,\n predicate: (value: A) => value is B,\n message: string,\n): Decoder<B, E | DecodeFailure> {\n return {\n decode(value) {\n const decoded = decoder.decode(value);\n if (isErr(decoded)) {\n return decoded;\n }\n\n return predicate(decoded.value)\n ? ok(decoded.value)\n : err(new DecodeFailure(message, { cause: value }));\n },\n };\n}\n\nfunction prependPathIfPossible<E>(error: E, segment: DecodePathSegment): E | DecodeFailure {\n return error instanceof DecodeFailure ? error.at(segment) : error;\n}\n\nfunction isOptionalDecoder(\n value: Decoder<unknown, unknown>,\n): value is OptionalDecoder<unknown, unknown> {\n return '__soundscriptOptional' in value &&\n value.__soundscriptOptional === true;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction valueOf<T>(decoded: { readonly value: T }): T {\n return decoded.value;\n}\n"]}
|
package/derive.d.ts
ADDED
package/derive.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Macro binding placeholders. The compiler-owned macro pipeline consumes these symbols.
|
|
2
|
+
export const eq = undefined;
|
|
3
|
+
export const hash = undefined;
|
|
4
|
+
export const decode = undefined;
|
|
5
|
+
export const encode = undefined;
|
|
6
|
+
export const codec = undefined;
|
|
7
|
+
export const tagged = undefined;
|
|
8
|
+
//# sourceMappingURL=derive.js.map
|
package/derive.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["./soundscript/derive.sts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,CAAC,MAAM,EAAE,GAAY,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAY,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,MAAM,GAAY,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAY,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAY,SAAS,CAAC;AACxC,MAAM,CAAC,MAAM,MAAM,GAAY,SAAS,CAAC","sourcesContent":["// Macro binding placeholders. The compiler-owned macro pipeline consumes these symbols.\nexport const eq: unknown = undefined;\nexport const hash: unknown = undefined;\nexport const decode: unknown = undefined;\nexport const encode: unknown = undefined;\nexport const codec: unknown = undefined;\nexport const tagged: unknown = undefined;\n"]}
|
package/encode.d.ts
CHANGED
|
@@ -7,15 +7,17 @@ export class EncodeFailure extends Failure {
|
|
|
7
7
|
constructor(message?: string, cause?: unknown);
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// #[variance(T: in, TEncoded: out, E: out)]
|
|
11
|
+
export type Encoder<T, TEncoded = unknown, E = EncodeFailure> = {
|
|
11
12
|
encode(value: T): Result<TEncoded, E>;
|
|
12
|
-
}
|
|
13
|
+
};
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
// #[variance(T: in, TEncoded: out, E: out)]
|
|
16
|
+
export type OptionalEncoder<T, TEncoded = T, E = EncodeFailure> =
|
|
17
|
+
Encoder<T | undefined, TEncoded | undefined, E> & {
|
|
18
|
+
readonly __soundscriptOptional: true;
|
|
19
|
+
readonly inner: Encoder<T, TEncoded, E>;
|
|
20
|
+
};
|
|
19
21
|
|
|
20
22
|
type EncoderInput<TEncoder> = TEncoder extends Encoder<infer TValue, unknown, unknown> ? TValue
|
|
21
23
|
: never;
|
|
@@ -72,8 +74,8 @@ export function option<T, TEncoded, E>(
|
|
|
72
74
|
item: Encoder<T, TEncoded, E>,
|
|
73
75
|
): Encoder<
|
|
74
76
|
Option<T>,
|
|
75
|
-
{ readonly
|
|
76
|
-
readonly tag: '
|
|
77
|
+
{ readonly tag: 'none' } | {
|
|
78
|
+
readonly tag: 'some';
|
|
77
79
|
readonly value: TEncoded;
|
|
78
80
|
},
|
|
79
81
|
E
|
package/encode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Failure } from '@soundscript/soundscript/failures';
|
|
2
|
-
import { err, isErr, ok } from '@soundscript/soundscript/result';
|
|
2
|
+
import { err, isErr, isOk, isSome, ok } from '@soundscript/soundscript/result';
|
|
3
3
|
export class EncodeFailure extends Failure {
|
|
4
4
|
constructor(message = 'Failed to encode value.', cause) {
|
|
5
5
|
super(message, { cause });
|
|
@@ -75,16 +75,16 @@ export function tuple(...elements) {
|
|
|
75
75
|
}
|
|
76
76
|
export function option(item) {
|
|
77
77
|
return fromEncode((value) => {
|
|
78
|
-
if (value
|
|
78
|
+
if (isSome(value)) {
|
|
79
79
|
const encoded = item.encode(value.value);
|
|
80
|
-
return isErr(encoded) ? encoded : ok({ tag: '
|
|
80
|
+
return isErr(encoded) ? encoded : ok({ tag: 'some', value: encoded.value });
|
|
81
81
|
}
|
|
82
|
-
return ok({ tag: '
|
|
82
|
+
return ok({ tag: 'none' });
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
export function result(okEncoder, errEncoder) {
|
|
86
86
|
return fromEncode((value) => {
|
|
87
|
-
if (value
|
|
87
|
+
if (isOk(value)) {
|
|
88
88
|
const encoded = okEncoder.encode(value.value);
|
|
89
89
|
return isErr(encoded) ? encoded : ok({ tag: 'ok', value: encoded.value });
|
|
90
90
|
}
|
package/encode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encode.js","sourceRoot":"","sources":["./soundscript/encode.sts"],"names":[],"mappings":"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","sourcesContent":["import { type Bind, type Kind3, type TypeLambda } from '@soundscript/soundscript/hkt';\nimport { Failure } from '@soundscript/soundscript/failures';\nimport { err, isErr, ok, type Option, type Result } from '@soundscript/soundscript/result';\nimport type { Contravariant } from '@soundscript/soundscript/typeclasses';\n\nexport class EncodeFailure extends Failure {\n constructor(message = 'Failed to encode value.', cause?: unknown) {\n super(message, { cause });\n }\n}\n\nexport interface Encoder<T, TEncoded = unknown, E = EncodeFailure> {\n encode(value: T): Result<TEncoded, E>;\n}\n\nexport interface OptionalEncoder<T, TEncoded = T, E = EncodeFailure>\n extends Encoder<T | undefined, TEncoded | undefined, E> {\n readonly __soundscriptOptional: true;\n readonly inner: Encoder<T, TEncoded, E>;\n}\n\ntype EncoderInput<TEncoder> = TEncoder extends Encoder<infer T, unknown, unknown> ? T : never;\ntype EncoderOutput<TEncoder> = TEncoder extends Encoder<unknown, infer TEncoded, unknown> ? TEncoded\n : never;\ntype EncoderError<TEncoder> = TEncoder extends Encoder<unknown, unknown, infer E> ? E : never;\ntype ObjectShape = Record<string, Encoder<unknown, unknown, unknown>>;\ntype TupleShape = readonly Encoder<unknown, unknown, unknown>[];\n\nexport interface EncoderF extends TypeLambda {\n readonly type: Encoder<this['Args'][2], this['Args'][1], this['Args'][0]>;\n}\n\nexport type EncoderKind<E, TEncoded, T> = Kind3<EncoderF, E, TEncoded, T>;\n\nexport function fromEncode<T, TEncoded, E>(\n encode: (value: T) => Result<TEncoded, E>,\n): Encoder<T, TEncoded, E> {\n return {\n encode,\n };\n}\n\nexport function contramap<A, B, TEncoded, E>(\n encoder: Encoder<A, TEncoded, E>,\n project: (value: B) => A,\n): Encoder<B, TEncoded, E> {\n return fromEncode((value) => encoder.encode(project(value)));\n}\n\nexport function encoderContravariant<TEncoded, E = EncodeFailure>(): Contravariant<\n Bind<Bind<EncoderF, [E]>, [TEncoded]>\n> {\n return {\n contramap,\n };\n}\n\nexport const stringEncoder: Encoder<string, string> = fromEncode((value) => ok(value));\nexport const numberEncoder: Encoder<number, number> = fromEncode((value) => ok(value));\nexport const booleanEncoder: Encoder<boolean, boolean> = fromEncode((value) => ok(value));\nexport const bigintEncoder: Encoder<bigint, bigint> = fromEncode((value) => ok(value));\n\nexport function optional<T, TEncoded, E>(\n encoder: Encoder<T, TEncoded, E>,\n): OptionalEncoder<T, TEncoded, E> {\n return {\n __soundscriptOptional: true,\n inner: encoder,\n encode(value) {\n return value === undefined ? ok(undefined) : encoder.encode(value);\n },\n };\n}\n\nexport function lazy<T, TEncoded, E>(\n getEncoder: () => Encoder<T, TEncoded, E>,\n): Encoder<T, TEncoded, E> {\n return fromEncode((value) => getEncoder().encode(value));\n}\n\nexport function nullable<T, TEncoded, E>(\n encoder: Encoder<T, TEncoded, E>,\n): Encoder<T | null, TEncoded | null, E> {\n return fromEncode((value) => value === null ? ok(null) : encoder.encode(value));\n}\n\nexport function literal<const T extends string | number | boolean | null>(value: T): Encoder<T, T> {\n return fromEncode((input) =>\n Object.is(input, value)\n ? ok(value)\n : err(new EncodeFailure(`Expected literal ${JSON.stringify(value)}.`, input))\n );\n}\n\nexport function array<T, TEncoded, E>(\n item: Encoder<T, TEncoded, E>,\n): Encoder<readonly T[], readonly TEncoded[], E | EncodeFailure> {\n return fromEncode((value) => {\n const encodedValues: TEncoded[] = [];\n for (const entry of value) {\n const encoded = item.encode(entry);\n if (isErr(encoded)) {\n return encoded;\n }\n encodedValues.push(encoded.value);\n }\n return ok(encodedValues);\n });\n}\n\nexport function tuple<const TElements extends TupleShape>(\n ...elements: TElements\n): Encoder<\n { readonly [K in keyof TElements]: EncoderInput<TElements[K]> },\n { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> },\n EncoderError<TElements[number]>\n> {\n return fromEncode((value) => {\n const values = value as readonly unknown[];\n const encodedValues: unknown[] = [];\n for (let index = 0; index < elements.length; index += 1) {\n const elementEncoder = elements[index];\n if (!elementEncoder) {\n continue;\n }\n const encoded = elementEncoder.encode(values[index] as never);\n if (isErr(encoded)) {\n return encoded as Result<\n { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> },\n EncoderError<TElements[number]>\n >;\n }\n encodedValues.push(encoded.value);\n }\n return ok(encodedValues as { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> });\n });\n}\n\nexport function option<T, TEncoded, E>(\n item: Encoder<T, TEncoded, E>,\n): Encoder<\n Option<T>,\n { readonly error?: undefined; readonly tag: 'err' } | {\n readonly tag: 'ok';\n readonly value: TEncoded;\n },\n E\n> {\n return fromEncode<\n Option<T>,\n { readonly error?: undefined; readonly tag: 'err' } | {\n readonly tag: 'ok';\n readonly value: TEncoded;\n },\n E\n >((value) => {\n if (value.tag === 'ok') {\n const encoded = item.encode(value.value);\n return isErr(encoded) ? encoded : ok({ tag: 'ok', value: encoded.value });\n }\n\n return ok({ tag: 'err', error: undefined });\n });\n}\n\nexport function result<T, EValue, TEncoded, EEncoded, EOk, EErr>(\n okEncoder: Encoder<T, TEncoded, EOk>,\n errEncoder: Encoder<EValue, EEncoded, EErr>,\n): Encoder<\n Result<T, EValue>,\n { readonly tag: 'ok'; readonly value: TEncoded } | {\n readonly error: EEncoded;\n readonly tag: 'err';\n },\n EOk | EErr\n> {\n return fromEncode<\n Result<T, EValue>,\n { readonly tag: 'ok'; readonly value: TEncoded } | {\n readonly error: EEncoded;\n readonly tag: 'err';\n },\n EOk | EErr\n >((value) => {\n if (value.tag === 'ok') {\n const encoded = okEncoder.encode(value.value);\n return isErr(encoded) ? encoded : ok({ tag: 'ok', value: encoded.value });\n }\n\n const encoded = errEncoder.encode(value.error);\n return isErr(encoded) ? encoded : ok({ tag: 'err', error: encoded.value });\n });\n}\n\nexport function object<TShape extends ObjectShape>(\n shape: TShape,\n): Encoder<\n { readonly [K in keyof TShape]: EncoderInput<TShape[K]> },\n { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> },\n EncoderError<TShape[keyof TShape]> | EncodeFailure\n> {\n return fromEncode<\n { readonly [K in keyof TShape]: EncoderInput<TShape[K]> },\n { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> },\n EncoderError<TShape[keyof TShape]> | EncodeFailure\n >((value) => {\n if (!isPlainObject(value)) {\n return err<EncoderError<TShape[keyof TShape]> | EncodeFailure>(\n new EncodeFailure('Expected object.', value),\n );\n }\n\n const record = value as Record<string, unknown>;\n const encodedObject: Record<string, unknown> = {};\n\n for (const key of Object.keys(shape)) {\n const encoder = shape[key];\n const hasKey = key in record;\n const rawValue = record[key];\n\n if (!hasKey || rawValue === undefined) {\n if (isOptionalEncoder(encoder)) {\n encodedObject[key] = undefined;\n continue;\n }\n\n return err<EncoderError<TShape[keyof TShape]> | EncodeFailure>(\n new EncodeFailure(`Missing field \"${key}\".`, value),\n );\n }\n\n const encoded = encoder.encode(rawValue as never) as Result<\n unknown,\n EncoderError<TShape[keyof TShape]> | EncodeFailure\n >;\n if (isErr(encoded)) {\n return encoded;\n }\n encodedObject[key] = encoded.value;\n }\n\n return ok(encodedObject as { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> });\n });\n}\n\nfunction isOptionalEncoder(\n value: Encoder<unknown, unknown, unknown>,\n): value is OptionalEncoder<unknown, unknown, unknown> {\n return '__soundscriptOptional' in value && value.__soundscriptOptional === true;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["./soundscript/encode.sts"],"names":[],"mappings":"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","sourcesContent":["import { type Bind, type Kind3, type TypeLambda } from '@soundscript/soundscript/hkt';\nimport { Failure } from '@soundscript/soundscript/failures';\nimport { err, isErr, isOk, isSome, ok, type Option, type Result } from '@soundscript/soundscript/result';\nimport type { Contravariant } from '@soundscript/soundscript/typeclasses';\n\nexport class EncodeFailure extends Failure {\n constructor(message = 'Failed to encode value.', cause?: unknown) {\n super(message, { cause });\n }\n}\n\n// #[variance(T: in, TEncoded: out, E: out)]\nexport type Encoder<T, TEncoded = unknown, E = EncodeFailure> = {\n encode(value: T): Result<TEncoded, E>;\n};\n\n// #[variance(T: in, TEncoded: out, E: out)]\nexport type OptionalEncoder<T, TEncoded = T, E = EncodeFailure> =\n Encoder<T | undefined, TEncoded | undefined, E> & {\n readonly __soundscriptOptional: true;\n readonly inner: Encoder<T, TEncoded, E>;\n };\n\ntype EncoderInput<TEncoder> = TEncoder extends Encoder<infer T, unknown, unknown> ? T : never;\ntype EncoderOutput<TEncoder> = TEncoder extends Encoder<unknown, infer TEncoded, unknown> ? TEncoded\n : never;\ntype EncoderError<TEncoder> = TEncoder extends Encoder<unknown, unknown, infer E> ? E : never;\ntype ObjectShape = Record<string, Encoder<unknown, unknown, unknown>>;\ntype TupleShape = readonly Encoder<unknown, unknown, unknown>[];\n\nexport interface EncoderF extends TypeLambda {\n readonly type: Encoder<this['Args'][2], this['Args'][1], this['Args'][0]>;\n}\n\nexport type EncoderKind<E, TEncoded, T> = Kind3<EncoderF, E, TEncoded, T>;\n\nexport function fromEncode<T, TEncoded, E>(\n encode: (value: T) => Result<TEncoded, E>,\n): Encoder<T, TEncoded, E> {\n return {\n encode,\n };\n}\n\nexport function contramap<A, B, TEncoded, E>(\n encoder: Encoder<A, TEncoded, E>,\n project: (value: B) => A,\n): Encoder<B, TEncoded, E> {\n return fromEncode((value) => encoder.encode(project(value)));\n}\n\nexport function encoderContravariant<TEncoded, E = EncodeFailure>(): Contravariant<\n Bind<Bind<EncoderF, [E]>, [TEncoded]>\n> {\n return {\n contramap,\n };\n}\n\nexport const stringEncoder: Encoder<string, string> = fromEncode((value) => ok(value));\nexport const numberEncoder: Encoder<number, number> = fromEncode((value) => ok(value));\nexport const booleanEncoder: Encoder<boolean, boolean> = fromEncode((value) => ok(value));\nexport const bigintEncoder: Encoder<bigint, bigint> = fromEncode((value) => ok(value));\n\nexport function optional<T, TEncoded, E>(\n encoder: Encoder<T, TEncoded, E>,\n): OptionalEncoder<T, TEncoded, E> {\n return {\n __soundscriptOptional: true,\n inner: encoder,\n encode(value) {\n return value === undefined ? ok(undefined) : encoder.encode(value);\n },\n };\n}\n\nexport function lazy<T, TEncoded, E>(\n getEncoder: () => Encoder<T, TEncoded, E>,\n): Encoder<T, TEncoded, E> {\n return fromEncode((value) => getEncoder().encode(value));\n}\n\nexport function nullable<T, TEncoded, E>(\n encoder: Encoder<T, TEncoded, E>,\n): Encoder<T | null, TEncoded | null, E> {\n return fromEncode((value) => value === null ? ok(null) : encoder.encode(value));\n}\n\nexport function literal<const T extends string | number | boolean | null>(value: T): Encoder<T, T> {\n return fromEncode((input) =>\n Object.is(input, value)\n ? ok(value)\n : err(new EncodeFailure(`Expected literal ${JSON.stringify(value)}.`, input))\n );\n}\n\nexport function array<T, TEncoded, E>(\n item: Encoder<T, TEncoded, E>,\n): Encoder<readonly T[], readonly TEncoded[], E | EncodeFailure> {\n return fromEncode((value) => {\n const encodedValues: TEncoded[] = [];\n for (const entry of value) {\n const encoded = item.encode(entry);\n if (isErr(encoded)) {\n return encoded;\n }\n encodedValues.push(encoded.value);\n }\n return ok(encodedValues);\n });\n}\n\nexport function tuple<const TElements extends TupleShape>(\n ...elements: TElements\n): Encoder<\n { readonly [K in keyof TElements]: EncoderInput<TElements[K]> },\n { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> },\n EncoderError<TElements[number]>\n> {\n return fromEncode((value) => {\n const values = value as readonly unknown[];\n const encodedValues: unknown[] = [];\n for (let index = 0; index < elements.length; index += 1) {\n const elementEncoder = elements[index];\n if (!elementEncoder) {\n continue;\n }\n const encoded = elementEncoder.encode(values[index] as never);\n if (isErr(encoded)) {\n return encoded as Result<\n { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> },\n EncoderError<TElements[number]>\n >;\n }\n encodedValues.push(encoded.value);\n }\n return ok(encodedValues as { readonly [K in keyof TElements]: EncoderOutput<TElements[K]> });\n });\n}\n\nexport function option<T, TEncoded, E>(\n item: Encoder<T, TEncoded, E>,\n): Encoder<\n Option<T>,\n { readonly tag: 'none' } | {\n readonly tag: 'some';\n readonly value: TEncoded;\n },\n E\n> {\n return fromEncode<\n Option<T>,\n { readonly tag: 'none' } | {\n readonly tag: 'some';\n readonly value: TEncoded;\n },\n E\n >((value) => {\n if (isSome(value)) {\n const encoded = item.encode(value.value);\n return isErr(encoded) ? encoded : ok({ tag: 'some', value: encoded.value });\n }\n\n return ok({ tag: 'none' });\n });\n}\n\nexport function result<T, EValue, TEncoded, EEncoded, EOk, EErr>(\n okEncoder: Encoder<T, TEncoded, EOk>,\n errEncoder: Encoder<EValue, EEncoded, EErr>,\n): Encoder<\n Result<T, EValue>,\n { readonly tag: 'ok'; readonly value: TEncoded } | {\n readonly error: EEncoded;\n readonly tag: 'err';\n },\n EOk | EErr\n> {\n return fromEncode<\n Result<T, EValue>,\n { readonly tag: 'ok'; readonly value: TEncoded } | {\n readonly error: EEncoded;\n readonly tag: 'err';\n },\n EOk | EErr\n >((value) => {\n if (isOk(value)) {\n const encoded = okEncoder.encode(value.value);\n return isErr(encoded) ? encoded : ok({ tag: 'ok', value: encoded.value });\n }\n\n const encoded = errEncoder.encode(value.error);\n return isErr(encoded) ? encoded : ok({ tag: 'err', error: encoded.value });\n });\n}\n\nexport function object<TShape extends ObjectShape>(\n shape: TShape,\n): Encoder<\n { readonly [K in keyof TShape]: EncoderInput<TShape[K]> },\n { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> },\n EncoderError<TShape[keyof TShape]> | EncodeFailure\n> {\n return fromEncode<\n { readonly [K in keyof TShape]: EncoderInput<TShape[K]> },\n { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> },\n EncoderError<TShape[keyof TShape]> | EncodeFailure\n >((value) => {\n if (!isPlainObject(value)) {\n return err<EncoderError<TShape[keyof TShape]> | EncodeFailure>(\n new EncodeFailure('Expected object.', value),\n );\n }\n\n const record = value as Record<string, unknown>;\n const encodedObject: Record<string, unknown> = {};\n\n for (const key of Object.keys(shape)) {\n const encoder = shape[key];\n const hasKey = key in record;\n const rawValue = record[key];\n\n if (!hasKey || rawValue === undefined) {\n if (isOptionalEncoder(encoder)) {\n encodedObject[key] = undefined;\n continue;\n }\n\n return err<EncoderError<TShape[keyof TShape]> | EncodeFailure>(\n new EncodeFailure(`Missing field \"${key}\".`, value),\n );\n }\n\n const encoded = encoder.encode(rawValue as never) as Result<\n unknown,\n EncoderError<TShape[keyof TShape]> | EncodeFailure\n >;\n if (isErr(encoded)) {\n return encoded;\n }\n encodedObject[key] = encoded.value;\n }\n\n return ok(encodedObject as { readonly [K in keyof TShape]: EncoderOutput<TShape[K]> });\n });\n}\n\nfunction isOptionalEncoder(\n value: Encoder<unknown, unknown, unknown>,\n): value is OptionalEncoder<unknown, unknown, unknown> {\n return '__soundscriptOptional' in value && value.__soundscriptOptional === true;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thunk.js","sourceRoot":"","sources":["../soundscript/experimental/thunk.sts"],"names":[],"mappings":"AAAA,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,kFAAkF,CAC1F,CAAC;AACJ,CAAC;AAGD,MAAM,UAAU,IAAI,CAAC,MAAe;IAClC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAGD,MAAM,UAAU,IAAI,CAAC,MAAe;IAClC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC","sourcesContent":["function macroRuntimeError(name: string): never {\n throw new Error(\n `${name}(...) is a Soundscript macro and should be removed during Soundscript expansion.`,\n );\n}\n\nexport function lazy<T>(_value: T): () => T;\nexport function lazy(_value: unknown): never {\n return macroRuntimeError('lazy');\n}\n\nexport function memo<T>(_value: T): () => T;\nexport function memo(_value: unknown): never {\n return macroRuntimeError('memo');\n}\n"]}
|