@soundscript/soundscript 0.1.0
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/LICENSE +15 -0
- package/README.md +10 -0
- package/async.d.ts +81 -0
- package/async.js +214 -0
- package/async.js.map +1 -0
- package/bin/soundscript.js +54 -0
- package/codec.d.ts +31 -0
- package/codec.js +31 -0
- package/codec.js.map +1 -0
- package/compare.d.ts +28 -0
- package/compare.js +121 -0
- package/compare.js.map +1 -0
- package/decode.d.ts +84 -0
- package/decode.js +249 -0
- package/decode.js.map +1 -0
- package/encode.d.ts +98 -0
- package/encode.js +128 -0
- package/encode.js.map +1 -0
- package/experimental/component.d.ts +40 -0
- package/experimental/component.js +46 -0
- package/experimental/component.js.map +1 -0
- package/experimental/css.d.ts +16 -0
- package/experimental/css.js +10 -0
- package/experimental/css.js.map +1 -0
- package/experimental/debug.d.ts +2 -0
- package/experimental/debug.js +10 -0
- package/experimental/debug.js.map +1 -0
- package/experimental/graphql.d.ts +16 -0
- package/experimental/graphql.js +10 -0
- package/experimental/graphql.js.map +1 -0
- package/experimental/sql.d.ts +22 -0
- package/experimental/sql.js +24 -0
- package/experimental/sql.js.map +1 -0
- package/failures.d.ts +23 -0
- package/failures.js +42 -0
- package/failures.js.map +1 -0
- package/hash.d.ts +34 -0
- package/hash.js +116 -0
- package/hash.js.map +1 -0
- package/hkt.d.ts +40 -0
- package/hkt.js +4 -0
- package/hkt.js.map +1 -0
- package/index.d.ts +9 -0
- package/index.js +16 -0
- package/index.js.map +1 -0
- package/json.d.ts +98 -0
- package/json.js +638 -0
- package/json.js.map +1 -0
- package/match.d.ts +11 -0
- package/match.js +14 -0
- package/match.js.map +1 -0
- package/package.json +153 -0
- package/result.d.ts +52 -0
- package/result.js +104 -0
- package/result.js.map +1 -0
- package/soundscript/async.sts +315 -0
- package/soundscript/codec.sts +75 -0
- package/soundscript/compare.sts +159 -0
- package/soundscript/decode.sts +382 -0
- package/soundscript/encode.sts +254 -0
- package/soundscript/experimental/component.sts +69 -0
- package/soundscript/experimental/css.sts +28 -0
- package/soundscript/experimental/debug.sts +10 -0
- package/soundscript/experimental/graphql.sts +28 -0
- package/soundscript/experimental/sql.sts +53 -0
- package/soundscript/failures.sts +64 -0
- package/soundscript/hash.sts +196 -0
- package/soundscript/hkt.sts +41 -0
- package/soundscript/index.sts +23 -0
- package/soundscript/json.sts +824 -0
- package/soundscript/match.sts +26 -0
- package/soundscript/result.sts +179 -0
- package/soundscript/thunk.sts +15 -0
- package/soundscript/typeclasses.sts +167 -0
- package/thunk.d.ts +2 -0
- package/thunk.js +10 -0
- package/thunk.js.map +1 -0
- package/typeclasses.d.ts +57 -0
- package/typeclasses.js +78 -0
- package/typeclasses.js.map +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jake McCloskey
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# @soundscript/soundscript
|
|
2
|
+
|
|
3
|
+
Canonical Soundscript toolchain and runtime package.
|
|
4
|
+
|
|
5
|
+
This package provides:
|
|
6
|
+
|
|
7
|
+
- the `soundscript` CLI launcher
|
|
8
|
+
- stable runtime and TypeScript interop modules under `@soundscript/soundscript/*`
|
|
9
|
+
- unstable runtime modules under `@soundscript/soundscript/experimental/*`
|
|
10
|
+
- the canonical package identity for built Soundscript libraries
|
package/async.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Bind, Kind2, TypeLambda } from '@soundscript/soundscript/hkt';
|
|
2
|
+
import { Failure } from '@soundscript/soundscript/failures';
|
|
3
|
+
import type { Result } from '@soundscript/soundscript/result';
|
|
4
|
+
import type { Applicative, AsyncMonad, Functor, Monad } from '@soundscript/soundscript/typeclasses';
|
|
5
|
+
|
|
6
|
+
export interface AbortSignalLike {
|
|
7
|
+
readonly aborted: boolean;
|
|
8
|
+
readonly reason?: unknown;
|
|
9
|
+
addEventListener(
|
|
10
|
+
type: 'abort',
|
|
11
|
+
listener: () => void,
|
|
12
|
+
options?: boolean | { once?: boolean },
|
|
13
|
+
): void;
|
|
14
|
+
removeEventListener(type: 'abort', listener: () => void, options?: boolean): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type Task<T, E = Error> = (signal?: AbortSignalLike) => Promise<Result<T, E>>;
|
|
18
|
+
|
|
19
|
+
export interface TaskF extends TypeLambda {
|
|
20
|
+
readonly type: Task<this['Args'][1], this['Args'][0]>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PromiseF extends TypeLambda {
|
|
24
|
+
readonly type: Promise<this['Args'][0]>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type TaskKind<E, T> = Kind2<TaskF, E, T>;
|
|
28
|
+
export type PromiseKind<T> = Promise<T>;
|
|
29
|
+
|
|
30
|
+
export class TimeoutFailure extends Failure {
|
|
31
|
+
readonly ms: number;
|
|
32
|
+
constructor(ms: number, cause?: unknown);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function succeed<T>(value: T): Task<T, never>;
|
|
36
|
+
export function fail<E>(error: E): Task<never, E>;
|
|
37
|
+
export function fromResult<T, E>(result: Result<T, E>): Task<T, E>;
|
|
38
|
+
export function fromPromise<T>(fn: (signal?: AbortSignalLike) => Promise<T>): Task<T, Error>;
|
|
39
|
+
export function fromPromise<T, E>(
|
|
40
|
+
fn: (signal?: AbortSignalLike) => Promise<T>,
|
|
41
|
+
mapError: (error: Error) => E,
|
|
42
|
+
): Task<T, E>;
|
|
43
|
+
export function map<A, B, E>(
|
|
44
|
+
task: Task<A, E>,
|
|
45
|
+
project: (value: A) => B,
|
|
46
|
+
): Task<B, E>;
|
|
47
|
+
export function mapError<A, E1, E2>(
|
|
48
|
+
task: Task<A, E1>,
|
|
49
|
+
project: (error: E1) => E2,
|
|
50
|
+
): Task<A, E2 | Error>;
|
|
51
|
+
export function flatMap<A, B, E1, E2>(
|
|
52
|
+
task: Task<A, E1>,
|
|
53
|
+
project: (value: A) => Task<B, E2>,
|
|
54
|
+
): Task<B, E1 | E2>;
|
|
55
|
+
export function recover<A, B, E>(
|
|
56
|
+
task: Task<A, E>,
|
|
57
|
+
project: (error: E) => B | PromiseLike<B>,
|
|
58
|
+
): Task<A | B, Error>;
|
|
59
|
+
export function tap<A, E>(
|
|
60
|
+
task: Task<A, E>,
|
|
61
|
+
effect: (value: A) => unknown | PromiseLike<unknown>,
|
|
62
|
+
): Task<A, E | Error>;
|
|
63
|
+
export function tapError<A, E>(
|
|
64
|
+
task: Task<A, E>,
|
|
65
|
+
effect: (error: E) => unknown | PromiseLike<unknown>,
|
|
66
|
+
): Task<A, E | Error>;
|
|
67
|
+
export function parallel<T, E>(tasks: readonly Task<T, E>[]): Task<readonly T[], E>;
|
|
68
|
+
export function race<T, E>(
|
|
69
|
+
tasks: readonly [Task<T, E>, ...Task<T, E>[]],
|
|
70
|
+
): Task<T, E>;
|
|
71
|
+
export function timeout<T, E>(task: Task<T, E>, ms: number): Task<T, E | TimeoutFailure>;
|
|
72
|
+
|
|
73
|
+
export function taskFunctor<E>(): Functor<Bind<TaskF, [E]>>;
|
|
74
|
+
export function taskApplicative<E>(): Applicative<Bind<TaskF, [E]>>;
|
|
75
|
+
export function taskMonad<E>(): Monad<Bind<TaskF, [E]>>;
|
|
76
|
+
export function taskAsyncMonad<E>(): AsyncMonad<Bind<TaskF, [E]>>;
|
|
77
|
+
|
|
78
|
+
export const promiseFunctor: Functor<PromiseF>;
|
|
79
|
+
export const promiseApplicative: Applicative<PromiseF>;
|
|
80
|
+
export const promiseMonad: Monad<PromiseF>;
|
|
81
|
+
export const promiseAsyncMonad: AsyncMonad<PromiseF>;
|
package/async.js
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { Failure, normalizeThrown } from '@soundscript/soundscript/failures';
|
|
2
|
+
import { err, isErr, ok, resultOf } from '@soundscript/soundscript/result';
|
|
3
|
+
export class TimeoutFailure extends Failure {
|
|
4
|
+
constructor(ms, cause) {
|
|
5
|
+
super(`Task timed out after ${ms}ms.`, { cause });
|
|
6
|
+
this.ms = ms;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function succeed(value) {
|
|
10
|
+
return () => Promise.resolve(ok(value));
|
|
11
|
+
}
|
|
12
|
+
export function fail(error) {
|
|
13
|
+
return () => Promise.resolve(err(error));
|
|
14
|
+
}
|
|
15
|
+
export function fromResult(result) {
|
|
16
|
+
return () => Promise.resolve(result);
|
|
17
|
+
}
|
|
18
|
+
export function fromPromise(fn, mapError) {
|
|
19
|
+
return async (signal) => {
|
|
20
|
+
if (mapError) {
|
|
21
|
+
return await resultOf(() => fn(signal), mapError);
|
|
22
|
+
}
|
|
23
|
+
return await resultOf(() => fn(signal));
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function map(task, project) {
|
|
27
|
+
return async (signal) => {
|
|
28
|
+
const result = await task(signal);
|
|
29
|
+
return isErr(result) ? result : ok(project(result.value));
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function mapError(task, project) {
|
|
33
|
+
return async (signal) => {
|
|
34
|
+
const result = await task(signal);
|
|
35
|
+
if (!isErr(result)) {
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
return err(project(result.error));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return err(normalizeThrown(error));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function flatMap(task, project) {
|
|
47
|
+
return async (signal) => {
|
|
48
|
+
const result = await task(signal);
|
|
49
|
+
if (isErr(result)) {
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
return await project(result.value)(signal);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function recover(task, project) {
|
|
56
|
+
return async (signal) => {
|
|
57
|
+
const result = await task(signal);
|
|
58
|
+
if (!isErr(result)) {
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
return await resultOf(async () => await project(result.error));
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function tap(task, effect) {
|
|
65
|
+
return async (signal) => {
|
|
66
|
+
const result = await task(signal);
|
|
67
|
+
if (isErr(result)) {
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
const observed = await resultOf(async () => await effect(result.value));
|
|
71
|
+
return isErr(observed) ? observed : result;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function tapError(task, effect) {
|
|
75
|
+
return async (signal) => {
|
|
76
|
+
const result = await task(signal);
|
|
77
|
+
if (!isErr(result)) {
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
const observed = await resultOf(async () => await effect(result.error));
|
|
81
|
+
return isErr(observed) ? observed : result;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function parallel(tasks) {
|
|
85
|
+
return async (signal) => {
|
|
86
|
+
const results = await Promise.all(tasks.map((task) => task(signal)));
|
|
87
|
+
const values = [];
|
|
88
|
+
for (const result of results) {
|
|
89
|
+
if (isErr(result)) {
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
values.push(result.value);
|
|
93
|
+
}
|
|
94
|
+
return ok(values);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function race(tasks) {
|
|
98
|
+
return async (signal) => {
|
|
99
|
+
const controller = new AbortController();
|
|
100
|
+
const cleanup = forwardAbort(signal, controller);
|
|
101
|
+
try {
|
|
102
|
+
return await Promise.race(tasks.map(async (task) => {
|
|
103
|
+
const result = await task(controller.signal);
|
|
104
|
+
controller.abort(result);
|
|
105
|
+
return result;
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
cleanup();
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export function timeout(task, ms) {
|
|
114
|
+
return async (signal) => {
|
|
115
|
+
const controller = new AbortController();
|
|
116
|
+
const cleanup = forwardAbort(signal, controller);
|
|
117
|
+
let timeoutId;
|
|
118
|
+
try {
|
|
119
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
120
|
+
timeoutId = setTimeout(() => {
|
|
121
|
+
const failure = new TimeoutFailure(ms);
|
|
122
|
+
resolve(err(failure));
|
|
123
|
+
controller.abort(failure);
|
|
124
|
+
}, ms);
|
|
125
|
+
});
|
|
126
|
+
return await Promise.race([
|
|
127
|
+
task(controller.signal),
|
|
128
|
+
timeoutPromise,
|
|
129
|
+
]);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
cleanup();
|
|
133
|
+
if (timeoutId !== undefined) {
|
|
134
|
+
clearTimeout(timeoutId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function forwardAbort(signal, controller) {
|
|
140
|
+
if (!signal) {
|
|
141
|
+
return () => { };
|
|
142
|
+
}
|
|
143
|
+
if (signal.aborted) {
|
|
144
|
+
controller.abort(signal.reason);
|
|
145
|
+
return () => { };
|
|
146
|
+
}
|
|
147
|
+
const onAbort = () => {
|
|
148
|
+
controller.abort(signal.reason);
|
|
149
|
+
};
|
|
150
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
151
|
+
return () => signal.removeEventListener('abort', onAbort);
|
|
152
|
+
}
|
|
153
|
+
function mapTask(task, project) {
|
|
154
|
+
return map(task, project);
|
|
155
|
+
}
|
|
156
|
+
function apTask(fn, value) {
|
|
157
|
+
return flatMap(fn, (resolvedFn) => map(value, resolvedFn));
|
|
158
|
+
}
|
|
159
|
+
function flatMapTask(task, project) {
|
|
160
|
+
return flatMap(task, project);
|
|
161
|
+
}
|
|
162
|
+
function createTaskMonad() {
|
|
163
|
+
return {
|
|
164
|
+
ap: apTask,
|
|
165
|
+
flatMap: flatMapTask,
|
|
166
|
+
map: mapTask,
|
|
167
|
+
pure: succeed,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function taskFunctor() {
|
|
171
|
+
return createTaskMonad();
|
|
172
|
+
}
|
|
173
|
+
export function taskApplicative() {
|
|
174
|
+
return createTaskMonad();
|
|
175
|
+
}
|
|
176
|
+
export function taskMonad() {
|
|
177
|
+
return createTaskMonad();
|
|
178
|
+
}
|
|
179
|
+
export function taskAsyncMonad() {
|
|
180
|
+
const monad = createTaskMonad();
|
|
181
|
+
return {
|
|
182
|
+
...monad,
|
|
183
|
+
fromPromise(promise) {
|
|
184
|
+
return fromPromise(() => Promise.resolve(promise));
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export const promiseFunctor = {
|
|
189
|
+
map(value, f) {
|
|
190
|
+
return value.then(f);
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
export const promiseApplicative = {
|
|
194
|
+
...promiseFunctor,
|
|
195
|
+
ap(fn, value) {
|
|
196
|
+
return Promise.all([fn, value]).then(([resolvedFn, resolvedValue]) => resolvedFn(resolvedValue));
|
|
197
|
+
},
|
|
198
|
+
pure(value) {
|
|
199
|
+
return Promise.resolve(value);
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
export const promiseMonad = {
|
|
203
|
+
...promiseApplicative,
|
|
204
|
+
flatMap(value, f) {
|
|
205
|
+
return value.then(f);
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
export const promiseAsyncMonad = {
|
|
209
|
+
...promiseMonad,
|
|
210
|
+
fromPromise(promise) {
|
|
211
|
+
return Promise.resolve(promise);
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=async.js.map
|
package/async.js.map
ADDED
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const TARGETS = {
|
|
8
|
+
"darwin-arm64": {
|
|
9
|
+
"executableName": "soundscript",
|
|
10
|
+
"packageName": "@soundscript/cli-darwin-arm64"
|
|
11
|
+
},
|
|
12
|
+
"darwin-x64": {
|
|
13
|
+
"executableName": "soundscript",
|
|
14
|
+
"packageName": "@soundscript/cli-darwin-x64"
|
|
15
|
+
},
|
|
16
|
+
"linux-arm64": {
|
|
17
|
+
"executableName": "soundscript",
|
|
18
|
+
"packageName": "@soundscript/cli-linux-arm64"
|
|
19
|
+
},
|
|
20
|
+
"linux-x64": {
|
|
21
|
+
"executableName": "soundscript",
|
|
22
|
+
"packageName": "@soundscript/cli-linux-x64"
|
|
23
|
+
},
|
|
24
|
+
"win32-x64": {
|
|
25
|
+
"executableName": "soundscript.exe",
|
|
26
|
+
"packageName": "@soundscript/cli-win32-x64"
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const SUPPORTED_TARGETS = ["darwin-arm64","darwin-x64","linux-arm64","linux-x64","win32-x64"];
|
|
30
|
+
|
|
31
|
+
const key = `${process.platform}-${process.arch}`;
|
|
32
|
+
const target = TARGETS[key];
|
|
33
|
+
if (!target) {
|
|
34
|
+
console.error(`soundscript does not publish a prebuilt CLI for ${key}.`);
|
|
35
|
+
console.error(`Supported platforms: ${SUPPORTED_TARGETS.join(", ")}.`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let packageJsonPath;
|
|
40
|
+
try {
|
|
41
|
+
packageJsonPath = require.resolve(`${target.packageName}/package.json`);
|
|
42
|
+
} catch (_error) {
|
|
43
|
+
console.error(`soundscript could not find the installed binary package ${target.packageName}. Reinstall the package for this platform.`);
|
|
44
|
+
console.error("Try `npm install soundscript --include=optional` or install the platform package directly.");
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const executablePath = join(dirname(packageJsonPath), 'bin', target.executableName);
|
|
49
|
+
const result = spawnSync(executablePath, process.argv.slice(2), { stdio: 'inherit' });
|
|
50
|
+
if (result.error) {
|
|
51
|
+
console.error(result.error instanceof Error ? result.error.message : String(result.error));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
process.exit(result.status === null ? 1 : result.status);
|
package/codec.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Bind, TypeLambda } from '@soundscript/soundscript/hkt';
|
|
2
|
+
import { type DecodeFailure, type Decoder } from '@soundscript/soundscript/decode';
|
|
3
|
+
import { contramap, type EncodeFailure, type Encoder } from '@soundscript/soundscript/encode';
|
|
4
|
+
import type { Invariant } from '@soundscript/soundscript/typeclasses';
|
|
5
|
+
|
|
6
|
+
export { booleanEncoder, contramap, numberEncoder, stringEncoder } from '@soundscript/soundscript/encode';
|
|
7
|
+
export type { EncodeFailure, Encoder } from '@soundscript/soundscript/encode';
|
|
8
|
+
|
|
9
|
+
export interface Codec<T, TEncoded = unknown, DE = DecodeFailure, EE = EncodeFailure>
|
|
10
|
+
extends Decoder<T, DE>, Encoder<T, TEncoded, EE> {}
|
|
11
|
+
|
|
12
|
+
export interface CodecF extends TypeLambda {
|
|
13
|
+
readonly type: Codec<this['Args'][3], this['Args'][2], this['Args'][1], this['Args'][0]>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function codec<T, TEncoded, DE, EE>(
|
|
17
|
+
decoder: Decoder<T, DE>,
|
|
18
|
+
encoder: Encoder<T, TEncoded, EE>,
|
|
19
|
+
): Codec<T, TEncoded, DE, EE>;
|
|
20
|
+
export function imap<A, B, TEncoded, DE, EE>(
|
|
21
|
+
base: Codec<A, TEncoded, DE, EE>,
|
|
22
|
+
decodeMap: (value: A) => B,
|
|
23
|
+
encodeMap: (value: B) => A,
|
|
24
|
+
): Codec<B, TEncoded, DE, EE>;
|
|
25
|
+
export function codecInvariant<TEncoded, DE = DecodeFailure, EE = EncodeFailure>(): Invariant<
|
|
26
|
+
Bind<Bind<Bind<CodecF, [EE]>, [DE]>, [TEncoded]>
|
|
27
|
+
>;
|
|
28
|
+
|
|
29
|
+
export const stringCodec: Codec<string, string>;
|
|
30
|
+
export const numberCodec: Codec<number, number>;
|
|
31
|
+
export const booleanCodec: Codec<boolean, boolean>;
|
package/codec.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { boolean as booleanDecoder, number as numberDecoder, string as stringDecoder, } from '@soundscript/soundscript/decode';
|
|
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';
|
|
4
|
+
export { booleanEncoderValue as booleanEncoder, contramapEncoder as contramap, numberEncoderValue as numberEncoder, stringEncoderValue as stringEncoder, };
|
|
5
|
+
export function codec(decoder, encoder) {
|
|
6
|
+
return {
|
|
7
|
+
decode(value) {
|
|
8
|
+
return decoder.decode(value);
|
|
9
|
+
},
|
|
10
|
+
encode(value) {
|
|
11
|
+
return encoder.encode(value);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function imap(base, decodeMap, encodeMap) {
|
|
16
|
+
return codec({
|
|
17
|
+
decode(value) {
|
|
18
|
+
const decoded = base.decode(value);
|
|
19
|
+
return decoded.tag === 'err' ? decoded : ok(decodeMap(decoded.value));
|
|
20
|
+
},
|
|
21
|
+
}, contramapEncoder(base, encodeMap));
|
|
22
|
+
}
|
|
23
|
+
export function codecInvariant() {
|
|
24
|
+
return {
|
|
25
|
+
imap,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export const stringCodec = codec(stringDecoder, stringEncoderValue);
|
|
29
|
+
export const numberCodec = codec(numberDecoder, numberEncoderValue);
|
|
30
|
+
export const booleanCodec = codec(booleanDecoder, booleanEncoderValue);
|
|
31
|
+
//# sourceMappingURL=codec.js.map
|
package/codec.js.map
ADDED
|
@@ -0,0 +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;AAGrD,OAAO,EACL,mBAAmB,IAAI,cAAc,EACrC,gBAAgB,IAAI,SAAS,EAC7B,kBAAkB,IAAI,aAAa,EACnC,kBAAkB,IAAI,aAAa,GACpC,CAAC;AASF,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,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,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 { ok } 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\nexport interface Codec<T, TEncoded = unknown, DE = DecodeFailure, EE = EncodeFailure>\n extends 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) {\n return decoder.decode(value);\n },\n encode(value) {\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) {\n const decoded = base.decode(value);\n return decoded.tag === 'err' ? 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.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Option, Result } from '@soundscript/soundscript/result';
|
|
2
|
+
|
|
3
|
+
export type Ordering = -1 | 0 | 1;
|
|
4
|
+
|
|
5
|
+
export interface Eq<T> {
|
|
6
|
+
equals(left: T, right: T): boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface Order<T> extends Eq<T> {
|
|
10
|
+
compare(left: T, right: T): Ordering;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type EqValue<TEq> = TEq extends Eq<infer TValue> ? TValue : never;
|
|
14
|
+
|
|
15
|
+
export const stringEq: Eq<string>;
|
|
16
|
+
export const numberEq: Eq<number>;
|
|
17
|
+
export const booleanEq: Eq<boolean>;
|
|
18
|
+
export const bigintEq: Eq<bigint>;
|
|
19
|
+
export function lazyEq<T>(getEq: () => Eq<T>): Eq<T>;
|
|
20
|
+
export function arrayEq<T>(itemEq: Eq<T>): Eq<readonly T[]>;
|
|
21
|
+
export function tupleEq<const TEqs extends readonly Eq<unknown>[]>(
|
|
22
|
+
...elements: TEqs
|
|
23
|
+
): Eq<{ readonly [K in keyof TEqs]: EqValue<TEqs[K]> }>;
|
|
24
|
+
export function optionEq<T>(itemEq: Eq<T>): Eq<Option<T>>;
|
|
25
|
+
export function resultEq<T, E>(okEq: Eq<T>, errEq: Eq<E>): Eq<Result<T, E>>;
|
|
26
|
+
export function fromCompare<T>(compare: (left: T, right: T) => number): Order<T>;
|
|
27
|
+
export function reverse<T>(order: Order<T>): Order<T>;
|
|
28
|
+
export function thenBy<T>(primary: Order<T>, secondary: Order<T>): Order<T>;
|
package/compare.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export const stringEq = {
|
|
2
|
+
equals(left, right) {
|
|
3
|
+
return left === right;
|
|
4
|
+
},
|
|
5
|
+
};
|
|
6
|
+
export const numberEq = {
|
|
7
|
+
equals(left, right) {
|
|
8
|
+
return left === right || (Number.isNaN(left) && Number.isNaN(right));
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
export const booleanEq = {
|
|
12
|
+
equals(left, right) {
|
|
13
|
+
return left === right;
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export const bigintEq = {
|
|
17
|
+
equals(left, right) {
|
|
18
|
+
return left === right;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export function lazyEq(getEq) {
|
|
22
|
+
return {
|
|
23
|
+
equals(left, right) {
|
|
24
|
+
return getEq().equals(left, right);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function arrayEq(itemEq) {
|
|
29
|
+
return {
|
|
30
|
+
equals(left, right) {
|
|
31
|
+
if (left.length !== right.length) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
for (let index = 0; index < left.length; index += 1) {
|
|
35
|
+
if (!itemEq.equals(left[index], right[index])) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function tupleEq(...elements) {
|
|
44
|
+
return {
|
|
45
|
+
equals(left, right) {
|
|
46
|
+
const leftValues = left;
|
|
47
|
+
const rightValues = right;
|
|
48
|
+
if (leftValues.length !== elements.length || rightValues.length !== elements.length) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
for (let index = 0; index < elements.length; index += 1) {
|
|
52
|
+
const elementEq = elements[index];
|
|
53
|
+
if (!elementEq) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!elementEq.equals(leftValues[index], rightValues[index])) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function optionEq(itemEq) {
|
|
65
|
+
return {
|
|
66
|
+
equals(left, right) {
|
|
67
|
+
if (left.tag !== right.tag) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (left.tag === 'ok' && right.tag === 'ok') {
|
|
71
|
+
return itemEq.equals(left.value, right.value);
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function resultEq(okEq, errEq) {
|
|
78
|
+
return {
|
|
79
|
+
equals(left, right) {
|
|
80
|
+
if (left.tag !== right.tag) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (left.tag === 'ok' && right.tag === 'ok') {
|
|
84
|
+
return okEq.equals(left.value, right.value);
|
|
85
|
+
}
|
|
86
|
+
if (left.tag === 'err' && right.tag === 'err') {
|
|
87
|
+
return errEq.equals(left.error, right.error);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function fromCompare(compare) {
|
|
94
|
+
return {
|
|
95
|
+
equals(left, right) {
|
|
96
|
+
return normalizeOrdering(compare(left, right)) === 0;
|
|
97
|
+
},
|
|
98
|
+
compare(left, right) {
|
|
99
|
+
return normalizeOrdering(compare(left, right));
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function reverse(order) {
|
|
104
|
+
return fromCompare((left, right) => order.compare(right, left));
|
|
105
|
+
}
|
|
106
|
+
export function thenBy(primary, secondary) {
|
|
107
|
+
return fromCompare((left, right) => {
|
|
108
|
+
const primaryOrdering = primary.compare(left, right);
|
|
109
|
+
return primaryOrdering !== 0 ? primaryOrdering : secondary.compare(left, right);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function normalizeOrdering(value) {
|
|
113
|
+
if (value < 0) {
|
|
114
|
+
return -1;
|
|
115
|
+
}
|
|
116
|
+
if (value > 0) {
|
|
117
|
+
return 1;
|
|
118
|
+
}
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=compare.js.map
|
package/compare.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["./soundscript/compare.sts"],"names":[],"mappings":"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","sourcesContent":["import type { Option, 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 (left.tag !== right.tag) {\n return false;\n }\n\n if (left.tag === 'ok' && right.tag === 'ok') {\n return itemEq.equals(left.value, right.value);\n }\n\n return true;\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 (left.tag !== right.tag) {\n return false;\n }\n\n if (left.tag === 'ok' && right.tag === 'ok') {\n return okEq.equals(left.value, right.value);\n }\n\n if (left.tag === 'err' && right.tag === 'err') {\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"]}
|