@elaraai/e3 1.0.79 → 1.0.80
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 +11 -2
- package/dist/src/browser.d.ts +5 -4
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +3 -2
- package/dist/src/browser.js.map +1 -1
- package/dist/src/dataset-file.d.ts +17 -19
- package/dist/src/dataset-file.d.ts.map +1 -1
- package/dist/src/dataset-file.js +26 -45
- package/dist/src/dataset-file.js.map +1 -1
- package/dist/src/export.d.ts +2 -3
- package/dist/src/export.d.ts.map +1 -1
- package/dist/src/export.js +150 -80
- package/dist/src/export.js.map +1 -1
- package/dist/src/export.spec.js +177 -57
- package/dist/src/export.spec.js.map +1 -1
- package/dist/src/function.spec.js +29 -58
- package/dist/src/function.spec.js.map +1 -1
- package/dist/src/functions-link.spec.js +19 -17
- package/dist/src/functions-link.spec.js.map +1 -1
- package/dist/src/index.d.ts +56 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/input.d.ts +8 -5
- package/dist/src/input.d.ts.map +1 -1
- package/dist/src/input.js +8 -5
- package/dist/src/input.js.map +1 -1
- package/dist/src/migration.d.ts +172 -0
- package/dist/src/migration.d.ts.map +1 -0
- package/dist/src/migration.js +108 -0
- package/dist/src/migration.js.map +1 -0
- package/dist/src/migration.spec.d.ts +6 -0
- package/dist/src/migration.spec.d.ts.map +1 -0
- package/dist/src/migration.spec.js +197 -0
- package/dist/src/migration.spec.js.map +1 -0
- package/dist/src/mutation-programs.spec.d.ts +6 -0
- package/dist/src/mutation-programs.spec.d.ts.map +1 -0
- package/dist/src/mutation-programs.spec.js +310 -0
- package/dist/src/mutation-programs.spec.js.map +1 -0
- package/dist/src/mutation.d.ts +117 -9
- package/dist/src/mutation.d.ts.map +1 -1
- package/dist/src/mutation.js +104 -46
- package/dist/src/mutation.js.map +1 -1
- package/dist/src/open-beast-link.spec.js +10 -8
- package/dist/src/open-beast-link.spec.js.map +1 -1
- package/dist/src/output.d.ts +117 -0
- package/dist/src/output.d.ts.map +1 -0
- package/dist/src/output.js +119 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/package.d.ts +7 -5
- package/dist/src/package.d.ts.map +1 -1
- package/dist/src/package.js +98 -8
- package/dist/src/package.js.map +1 -1
- package/dist/src/package.spec.d.ts +6 -0
- package/dist/src/package.spec.d.ts.map +1 -0
- package/dist/src/package.spec.js +16 -0
- package/dist/src/package.spec.js.map +1 -0
- package/dist/src/record-guards.d.ts +41 -0
- package/dist/src/record-guards.d.ts.map +1 -0
- package/dist/src/record-guards.js +44 -0
- package/dist/src/record-guards.js.map +1 -0
- package/dist/src/record-index.d.ts +129 -0
- package/dist/src/record-index.d.ts.map +1 -0
- package/dist/src/record-index.js +144 -0
- package/dist/src/record-index.js.map +1 -0
- package/dist/src/record-index.spec.d.ts +6 -0
- package/dist/src/record-index.spec.d.ts.map +1 -0
- package/dist/src/record-index.spec.js +160 -0
- package/dist/src/record-index.spec.js.map +1 -0
- package/dist/src/record-programs.d.ts +128 -0
- package/dist/src/record-programs.d.ts.map +1 -0
- package/dist/src/record-programs.js +480 -0
- package/dist/src/record-programs.js.map +1 -0
- package/dist/src/record.d.ts.map +1 -1
- package/dist/src/record.js +2 -0
- package/dist/src/record.js.map +1 -1
- package/dist/src/record.spec.js +71 -13
- package/dist/src/record.spec.js.map +1 -1
- package/dist/src/runner.d.ts +6 -9
- package/dist/src/runner.d.ts.map +1 -1
- package/dist/src/runner.js +9 -25
- package/dist/src/runner.js.map +1 -1
- package/dist/src/runner.spec.js +16 -34
- package/dist/src/runner.spec.js.map +1 -1
- package/dist/src/sha256.d.ts +4 -3
- package/dist/src/sha256.d.ts.map +1 -1
- package/dist/src/sha256.js +20 -17
- package/dist/src/sha256.js.map +1 -1
- package/dist/src/sha256.spec.js +10 -0
- package/dist/src/sha256.spec.js.map +1 -1
- package/dist/src/task.d.ts +116 -251
- package/dist/src/task.d.ts.map +1 -1
- package/dist/src/task.js +169 -435
- package/dist/src/task.js.map +1 -1
- package/dist/src/task.spec.js +174 -489
- package/dist/src/task.spec.js.map +1 -1
- package/dist/src/types.d.ts +215 -23
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/src/mutation.js
CHANGED
|
@@ -2,65 +2,123 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
-
import { Expr,
|
|
5
|
+
import { Expr, NullType, PatchType, printType } from '@elaraai/east';
|
|
6
|
+
import { editTypeOf } from '@elaraai/e3-types';
|
|
7
|
+
import { hasKeyedDelta } from './record-programs.js';
|
|
8
|
+
import { checkPure, sameEastType } from './record-guards.js';
|
|
6
9
|
import { DEFAULT_RUNNER, runnerToVariant } from './runner.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
/** A mutation's name is an identifier, as a migration's and an index's are: it
|
|
11
|
+
* names the commits the mutation makes, beside e3's own, which begin with `$`,
|
|
12
|
+
* and `e3 mutate` addresses it as `record.mutation`. */
|
|
13
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
14
|
+
/** Refuses a mutation name that is not an identifier. */
|
|
15
|
+
function checkName(surface, name) {
|
|
16
|
+
if (!IDENTIFIER.test(name)) {
|
|
17
|
+
throw new Error(`e3.${surface} requires a name that is an identifier, got '${name}' — it names the record's ` +
|
|
18
|
+
`commits beside e3's own, which begin with '$', and \`e3 mutate\` addresses it as record.mutation.`);
|
|
14
19
|
}
|
|
20
|
+
}
|
|
21
|
+
/** The shared guards: a synchronous, platform-free body whose leading
|
|
22
|
+
* parameter is the record's state. Returns the body's signature. */
|
|
23
|
+
function checkBody(surface, name, rec, fn) {
|
|
24
|
+
checkName(surface, name);
|
|
25
|
+
checkPure(`e3.${surface} '${name}' body`, fn, {
|
|
26
|
+
async: 'an async body implies platform IO, which the compare-and-swap retry loop cannot safely re-run against fresher state.',
|
|
27
|
+
platform: 'the compare-and-swap retry loop re-runs the mutation, so a platform call makes the committed record non-deterministic across retries.',
|
|
28
|
+
});
|
|
29
|
+
const signature = Expr.type(fn);
|
|
30
|
+
if (signature.inputs.length < 1 || !sameEastType(rec.type, signature.inputs[0])) {
|
|
31
|
+
const got = signature.inputs.length ? printType(signature.inputs[0]) : 'no parameters';
|
|
32
|
+
throw new Error(`e3.${surface} '${name}' body's first parameter must be the record's ` +
|
|
33
|
+
`state type ${printType(rec.type)}, but got ${got}.`);
|
|
34
|
+
}
|
|
35
|
+
return signature;
|
|
36
|
+
}
|
|
37
|
+
/** Refuses a form whose delta cannot be addressed by key. An Array record's
|
|
38
|
+
* patch is positional and a scalar's is a whole replace, so neither can be
|
|
39
|
+
* applied segment by segment — and both are exactly what the `reduce` form
|
|
40
|
+
* already handles by writing the state whole. */
|
|
41
|
+
function checkKeyed(surface, name, rec) {
|
|
42
|
+
if (!hasKeyedDelta(rec.type)) {
|
|
43
|
+
throw new Error(`e3.${surface} '${name}' writes a delta addressed by key, so it needs a ` +
|
|
44
|
+
`Dict or Set record — '${rec.name}' holds ${printType(rec.type)}. Use ` +
|
|
45
|
+
`e3.mutation.reduce, whose reducer returns the whole state.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function reduce(name, rec, fn, config) {
|
|
15
49
|
const runner = config?.runner ?? DEFAULT_RUNNER;
|
|
16
50
|
// Validate eagerly so a bad runner fails at definition time, not export time.
|
|
17
51
|
runnerToVariant(runner);
|
|
18
|
-
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
52
|
+
const signature = checkBody('mutation.reduce', name, rec, fn);
|
|
53
|
+
// The reducer is (state, ...args) => state: the return must be the record's
|
|
54
|
+
// state type too. The typed overload enforces this at compile time, but a
|
|
55
|
+
// dynamic / cast caller could pass a mismatched function — and because
|
|
56
|
+
// MutationObject omits the output type (it IS the record type), a mismatch
|
|
57
|
+
// would be silently undetectable downstream.
|
|
58
|
+
if (!sameEastType(rec.type, signature.output)) {
|
|
59
|
+
throw new Error(`e3.mutation.reduce '${name}' reducer must return the record's state type ` +
|
|
60
|
+
`${printType(rec.type)}, but returns ${printType(signature.output)}.`);
|
|
25
61
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
throw new Error(`e3.mutation '${name}'
|
|
49
|
-
`
|
|
62
|
+
return {
|
|
63
|
+
kind: 'mutation',
|
|
64
|
+
name,
|
|
65
|
+
record: rec,
|
|
66
|
+
form: 'reduce',
|
|
67
|
+
// Keep the full EastIR bundle (IR + source map) so export.ts can encode
|
|
68
|
+
// with encodeEastIR and preserve source locations.
|
|
69
|
+
body: fn.toIR(),
|
|
70
|
+
fn,
|
|
71
|
+
// The extra parameter types are everything after the leading state parameter.
|
|
72
|
+
argTypes: signature.inputs.slice(1),
|
|
73
|
+
runner,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function edit(name, rec, fn, config) {
|
|
77
|
+
const runner = config?.runner ?? DEFAULT_RUNNER;
|
|
78
|
+
runnerToVariant(runner);
|
|
79
|
+
checkKeyed('mutation.edit', name, rec);
|
|
80
|
+
const signature = checkBody('mutation.edit', name, rec, fn);
|
|
81
|
+
const editType = editTypeOf(rec.type);
|
|
82
|
+
const last = signature.inputs[signature.inputs.length - 1];
|
|
83
|
+
if (signature.inputs.length < 2 || last === undefined || !sameEastType(editType, last)) {
|
|
84
|
+
throw new Error(`e3.mutation.edit '${name}' body's LAST parameter must be the edit ` +
|
|
85
|
+
`capability ${printType(editType)} — e3.mutation.editType(record.type) — but got ` +
|
|
86
|
+
`${last === undefined ? 'no parameters' : printType(last)}.`);
|
|
50
87
|
}
|
|
51
|
-
if (!sameEastType(
|
|
52
|
-
throw new Error(`e3.mutation '${name}'
|
|
53
|
-
|
|
88
|
+
if (!sameEastType(NullType, signature.output)) {
|
|
89
|
+
throw new Error(`e3.mutation.edit '${name}' body writes through 'edit' and returns Null, ` +
|
|
90
|
+
`but returns ${printType(signature.output)}. Use e3.mutation.reduce for a reducer ` +
|
|
91
|
+
`that returns the whole state.`);
|
|
54
92
|
}
|
|
55
|
-
// The extra parameter types are everything after the leading state parameter.
|
|
56
|
-
const argTypes = fnType.inputs.slice(1);
|
|
57
93
|
return {
|
|
58
94
|
kind: 'mutation',
|
|
59
95
|
name,
|
|
60
96
|
record: rec,
|
|
61
|
-
|
|
62
|
-
|
|
97
|
+
form: 'edit',
|
|
98
|
+
body: fn.toIR(),
|
|
99
|
+
fn,
|
|
100
|
+
// The extra parameters sit between the leading state and the trailing edit.
|
|
101
|
+
argTypes: signature.inputs.slice(1, -1),
|
|
102
|
+
runner,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function patch(rec, name = 'patch', config) {
|
|
106
|
+
checkName('mutation.patch', name);
|
|
107
|
+
const runner = config?.runner ?? DEFAULT_RUNNER;
|
|
108
|
+
runnerToVariant(runner);
|
|
109
|
+
checkKeyed('mutation.patch', name, rec);
|
|
110
|
+
return {
|
|
111
|
+
kind: 'mutation',
|
|
112
|
+
name,
|
|
113
|
+
record: rec,
|
|
114
|
+
form: 'patch',
|
|
115
|
+
argTypes: [PatchType(rec.type)],
|
|
63
116
|
runner,
|
|
64
117
|
};
|
|
65
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* The write forms of a record: {@link reduce}, {@link edit} and {@link patch},
|
|
121
|
+
* and `editType`, the type of the capability an `edit` body writes through.
|
|
122
|
+
*/
|
|
123
|
+
export const mutation = { reduce, edit, patch, editType: editTypeOf };
|
|
66
124
|
//# sourceMappingURL=mutation.js.map
|
package/dist/src/mutation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation.js","sourceRoot":"","sources":["../../src/mutation.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"mutation.js","sourceRoot":"","sources":["../../src/mutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ import * as os from 'node:os';
|
|
|
19
19
|
import * as path from 'node:path';
|
|
20
20
|
import yauzl from 'yauzl';
|
|
21
21
|
import { East, DictType, FunctionType, IntegerType, StringType, StructType, decodeBeast2For, decodeEastIR, walkIR, IMPORT_PLATFORM, variant } from '@elaraai/east';
|
|
22
|
-
import {
|
|
22
|
+
import { decodePackageObject, decodeTaskObject } from '@elaraai/e3-types';
|
|
23
23
|
import { export_ } from './export.js';
|
|
24
24
|
import { package_ } from './package.js';
|
|
25
25
|
import { task } from './task.js';
|
|
@@ -88,12 +88,14 @@ async function readZip(zipPath) {
|
|
|
88
88
|
});
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
|
-
/** The
|
|
92
|
-
function
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
91
|
+
/** The program the task object of a bundle's task `name` names. */
|
|
92
|
+
function programOf(entries, name) {
|
|
93
|
+
const object = (hash) => new Uint8Array(entries.get(`objects/${hash.slice(0, 2)}/${hash.slice(2)}.beast2`));
|
|
94
|
+
const pkgRef = [...entries.keys()].find((key) => key.startsWith('packages/'));
|
|
95
|
+
const pkg = decodePackageObject(object(decodeBeast2For(StringType)(entries.get(pkgRef))));
|
|
96
|
+
const task = decodeTaskObject(object(pkg.tasks.get(name)));
|
|
97
|
+
assert.strictEqual(task.body.type, 'east');
|
|
98
|
+
return decodeEastIR(object(task.body.value.program));
|
|
97
99
|
}
|
|
98
100
|
const STOCK_RUNNERS = [
|
|
99
101
|
{ runtime: 'east-node', platforms: ['@elaraai/east-node-std'] },
|
|
@@ -117,7 +119,7 @@ describe('FileSystem.openBeast links on every stock runner (#660)', () => {
|
|
|
117
119
|
const pkg = package_('importer', '1.0.0', use);
|
|
118
120
|
const zipPath = path.join(tempDir, `importer-${runner.runtime}.zip`);
|
|
119
121
|
await export_(pkg, zipPath, { functions: [manifest] });
|
|
120
|
-
const bundle =
|
|
122
|
+
const bundle = programOf(await readZip(zipPath), 'sum_rows');
|
|
121
123
|
assert.strictEqual(countImports(bundle.ir), 0, 'the import resolved to embedded IR');
|
|
122
124
|
assert.deepStrictEqual(genericPlatformCalls(bundle.ir), [{ name: 'fs_open_beast', typeParameters: 1 }]);
|
|
123
125
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-beast-link.spec.js","sourceRoot":"","sources":["../../src/open-beast-link.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EACjE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"open-beast-link.spec.js","sourceRoot":"","sources":["../../src/open-beast-link.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Output kinds for `e3.streamTask` — `e3.output.*`.
|
|
7
|
+
*
|
|
8
|
+
* A stream task's body emits its output instead of returning it, and the
|
|
9
|
+
* output kind says what `emit` takes and how the parts of the output combine,
|
|
10
|
+
* whichever unit emitted them. Emission order is free: the platform sorts sets
|
|
11
|
+
* and dicts.
|
|
12
|
+
*/
|
|
13
|
+
import type { BlockBuilder, EastType, ExprType, SubtypeExprOrValue, ValueTypeOf } from '@elaraai/east';
|
|
14
|
+
import type { ArrayOutputDef, DictOutputDef, FoldOutputDef, SetOutputDef } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* An Array output: `emit(t)` appends an element. Parts concatenate: in
|
|
17
|
+
* emission order within a unit, and units in input order.
|
|
18
|
+
*
|
|
19
|
+
* @typeParam T - The element type
|
|
20
|
+
* @param type - The element type
|
|
21
|
+
* @returns The output kind
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const balances = e3.streamTask('balances', {
|
|
26
|
+
* inputs: [events],
|
|
27
|
+
* output: e3.output.array(FloatType),
|
|
28
|
+
* }, ($, events, emit) => {
|
|
29
|
+
* const balance = $.let(0.0);
|
|
30
|
+
* $.for(events, ($, event) => {
|
|
31
|
+
* $.assign(balance, balance.add(event.amount));
|
|
32
|
+
* $(emit(balance));
|
|
33
|
+
* });
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare function array<T extends EastType>(type: T): ArrayOutputDef<T>;
|
|
38
|
+
/**
|
|
39
|
+
* A Set output: `emit(t)` adds an element, and an element emitted twice is
|
|
40
|
+
* held once. Parts combine by union.
|
|
41
|
+
*
|
|
42
|
+
* @typeParam T - The element type
|
|
43
|
+
* @param type - The element type
|
|
44
|
+
* @returns The output kind
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const accounts = e3.streamTask('accounts', {
|
|
49
|
+
* inputs: [e3.partition(events)],
|
|
50
|
+
* output: e3.output.set(StringType),
|
|
51
|
+
* }, ($, events, emit) => {
|
|
52
|
+
* $.for(events, ($, event) => { $(emit(event.account)); });
|
|
53
|
+
* });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
declare function set<T extends EastType>(type: T): SetOutputDef<T>;
|
|
57
|
+
/**
|
|
58
|
+
* A Dict output: `emit(k, v)` adds an entry. Parts combine by key; the values
|
|
59
|
+
* of a key emitted more than once fold with `merge`, in input order, and
|
|
60
|
+
* without `merge` a repeated key fails the task, naming it.
|
|
61
|
+
*
|
|
62
|
+
* @typeParam K - The key type
|
|
63
|
+
* @typeParam V - The value type
|
|
64
|
+
* @param key - The key type
|
|
65
|
+
* @param value - The value type
|
|
66
|
+
* @param config - `merge`, an associative function of the key and two values
|
|
67
|
+
* @returns The output kind
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* const totals = e3.streamTask('totals', {
|
|
72
|
+
* inputs: [e3.partition(sales)],
|
|
73
|
+
* output: e3.output.dict(StringType, FloatType, { merge: ($, account, a, b) => a.add(b) }),
|
|
74
|
+
* }, ($, sales, emit) => {
|
|
75
|
+
* $.for(sales, ($, sale) => { $(emit(sale.account, sale.amount)); });
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare function dict<K extends EastType, V extends EastType>(key: K, value: V, config?: {
|
|
80
|
+
merge?: ($: BlockBuilder<V>, key: ExprType<K>, a: ExprType<V>, b: ExprType<V>) => SubtypeExprOrValue<V> | void;
|
|
81
|
+
}): DictOutputDef<K, V>;
|
|
82
|
+
/**
|
|
83
|
+
* A fold output: every value `emit(t)` is given is folded with `combine`,
|
|
84
|
+
* starting from `zero`, in input order, and the output is the result.
|
|
85
|
+
*
|
|
86
|
+
* @typeParam T - The folded value's type
|
|
87
|
+
* @param type - The folded value's type
|
|
88
|
+
* @param config - `zero`, an identity of `combine`; `combine`, associative
|
|
89
|
+
* @returns The output kind
|
|
90
|
+
* @throws {Error} When `zero` is not a value of `type`
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* const revenue = e3.streamTask('revenue', {
|
|
95
|
+
* inputs: [e3.partition(sales)],
|
|
96
|
+
* output: e3.output.fold(FloatType, { zero: 0.0, combine: ($, a, b) => a.add(b) }),
|
|
97
|
+
* }, ($, sales, emit) => {
|
|
98
|
+
* $.for(sales, ($, sale) => { $(emit(sale.amount)); });
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
declare function fold<T extends EastType>(type: T, config: {
|
|
103
|
+
zero: ValueTypeOf<T>;
|
|
104
|
+
combine: ($: BlockBuilder<T>, a: ExprType<T>, b: ExprType<T>) => SubtypeExprOrValue<T> | void;
|
|
105
|
+
}): FoldOutputDef<T>;
|
|
106
|
+
/**
|
|
107
|
+
* The output kinds a stream task emits into: `array`, `set`, `dict` and
|
|
108
|
+
* `fold`.
|
|
109
|
+
*/
|
|
110
|
+
export declare const output: {
|
|
111
|
+
array: typeof array;
|
|
112
|
+
set: typeof set;
|
|
113
|
+
dict: typeof dict;
|
|
114
|
+
fold: typeof fold;
|
|
115
|
+
};
|
|
116
|
+
export {};
|
|
117
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,iBAAS,KAAK,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAE7D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,GAAG,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAEzD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,iBAAS,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,EAClD,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,EACR,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAAE,GAC1H,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAOrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAS,IAAI,CAAC,CAAC,SAAS,QAAQ,EAC9B,IAAI,EAAE,CAAC,EACP,MAAM,EAAE;IACN,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC/F,GACA,aAAa,CAAC,CAAC,CAAC,CAWlB;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM;;;;;CAA6B,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { ArrayType, DictType, East, FunctionType, NullType, SetType, isValueOf, printType } from '@elaraai/east';
|
|
6
|
+
/**
|
|
7
|
+
* An Array output: `emit(t)` appends an element. Parts concatenate: in
|
|
8
|
+
* emission order within a unit, and units in input order.
|
|
9
|
+
*
|
|
10
|
+
* @typeParam T - The element type
|
|
11
|
+
* @param type - The element type
|
|
12
|
+
* @returns The output kind
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const balances = e3.streamTask('balances', {
|
|
17
|
+
* inputs: [events],
|
|
18
|
+
* output: e3.output.array(FloatType),
|
|
19
|
+
* }, ($, events, emit) => {
|
|
20
|
+
* const balance = $.let(0.0);
|
|
21
|
+
* $.for(events, ($, event) => {
|
|
22
|
+
* $.assign(balance, balance.add(event.amount));
|
|
23
|
+
* $(emit(balance));
|
|
24
|
+
* });
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
function array(type) {
|
|
29
|
+
return { kind: 'array', type: ArrayType(type), emit: FunctionType([type], NullType) };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A Set output: `emit(t)` adds an element, and an element emitted twice is
|
|
33
|
+
* held once. Parts combine by union.
|
|
34
|
+
*
|
|
35
|
+
* @typeParam T - The element type
|
|
36
|
+
* @param type - The element type
|
|
37
|
+
* @returns The output kind
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const accounts = e3.streamTask('accounts', {
|
|
42
|
+
* inputs: [e3.partition(events)],
|
|
43
|
+
* output: e3.output.set(StringType),
|
|
44
|
+
* }, ($, events, emit) => {
|
|
45
|
+
* $.for(events, ($, event) => { $(emit(event.account)); });
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
function set(type) {
|
|
50
|
+
return { kind: 'set', type: SetType(type), emit: FunctionType([type], NullType) };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A Dict output: `emit(k, v)` adds an entry. Parts combine by key; the values
|
|
54
|
+
* of a key emitted more than once fold with `merge`, in input order, and
|
|
55
|
+
* without `merge` a repeated key fails the task, naming it.
|
|
56
|
+
*
|
|
57
|
+
* @typeParam K - The key type
|
|
58
|
+
* @typeParam V - The value type
|
|
59
|
+
* @param key - The key type
|
|
60
|
+
* @param value - The value type
|
|
61
|
+
* @param config - `merge`, an associative function of the key and two values
|
|
62
|
+
* @returns The output kind
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* const totals = e3.streamTask('totals', {
|
|
67
|
+
* inputs: [e3.partition(sales)],
|
|
68
|
+
* output: e3.output.dict(StringType, FloatType, { merge: ($, account, a, b) => a.add(b) }),
|
|
69
|
+
* }, ($, sales, emit) => {
|
|
70
|
+
* $.for(sales, ($, sale) => { $(emit(sale.account, sale.amount)); });
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
function dict(key, value, config) {
|
|
75
|
+
return {
|
|
76
|
+
kind: 'dict',
|
|
77
|
+
type: DictType(key, value),
|
|
78
|
+
emit: FunctionType([key, value], NullType),
|
|
79
|
+
...(config?.merge !== undefined && { merge: East.function([key, value, value], value, config.merge).toIR() }),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A fold output: every value `emit(t)` is given is folded with `combine`,
|
|
84
|
+
* starting from `zero`, in input order, and the output is the result.
|
|
85
|
+
*
|
|
86
|
+
* @typeParam T - The folded value's type
|
|
87
|
+
* @param type - The folded value's type
|
|
88
|
+
* @param config - `zero`, an identity of `combine`; `combine`, associative
|
|
89
|
+
* @returns The output kind
|
|
90
|
+
* @throws {Error} When `zero` is not a value of `type`
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* const revenue = e3.streamTask('revenue', {
|
|
95
|
+
* inputs: [e3.partition(sales)],
|
|
96
|
+
* output: e3.output.fold(FloatType, { zero: 0.0, combine: ($, a, b) => a.add(b) }),
|
|
97
|
+
* }, ($, sales, emit) => {
|
|
98
|
+
* $.for(sales, ($, sale) => { $(emit(sale.amount)); });
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
function fold(type, config) {
|
|
103
|
+
if (!isValueOf(config.zero, type)) {
|
|
104
|
+
throw new Error(`e3.output.fold: zero is not a value of ${printType(type)}`);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
kind: 'fold',
|
|
108
|
+
type,
|
|
109
|
+
emit: FunctionType([type], NullType),
|
|
110
|
+
zero: config.zero,
|
|
111
|
+
combine: East.function([type, type], type, config.combine).toIR(),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The output kinds a stream task emits into: `array`, `set`, `dict` and
|
|
116
|
+
* `fold`.
|
|
117
|
+
*/
|
|
118
|
+
export const output = { array, set, dict, fold };
|
|
119
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGjH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,KAAK,CAAqB,IAAO;IACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,GAAG,CAAqB,IAAO;IACtC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;AACpF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,IAAI,CACX,GAAM,EACN,KAAQ,EACR,MAA2H;IAE3H,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;QAC1B,IAAI,EAAE,YAAY,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC;QAC1C,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;KACrH,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,IAAI,CACX,IAAO,EACP,MAGC;IAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI;QACJ,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAc,CAAC,CAAC,IAAI,EAAE;KACzE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC"}
|
package/dist/src/package.d.ts
CHANGED
|
@@ -2,10 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
* Package definitions for e3.
|
|
7
|
-
*/
|
|
8
|
-
import type { FunctionDef, MutationDef, PackageDef, PackageItem } from './types.js';
|
|
5
|
+
import type { FunctionDef, MigrationDef, MutationDef, RecordIndexDef, PackageDef, PackageItem } from './types.js';
|
|
9
6
|
/**
|
|
10
7
|
* Creates a package definition from items.
|
|
11
8
|
*
|
|
@@ -22,6 +19,11 @@ import type { FunctionDef, MutationDef, PackageDef, PackageItem } from './types.
|
|
|
22
19
|
* @param version - Package version
|
|
23
20
|
* @param items - Items to include (datasets, tasks)
|
|
24
21
|
* @returns A PackageDef with typed access to contents
|
|
22
|
+
* @throws {Error} When the name or the version cannot be a file name — a
|
|
23
|
+
* repository keeps the package at `packages/<name>/<version>` — when a
|
|
24
|
+
* record is given two different mutations, indexes or migrations of one
|
|
25
|
+
* name, or when a record's migrations are not one chain that leaves it as
|
|
26
|
+
* its declared type
|
|
25
27
|
*
|
|
26
28
|
* @example
|
|
27
29
|
* ```ts
|
|
@@ -37,5 +39,5 @@ import type { FunctionDef, MutationDef, PackageDef, PackageItem } from './types.
|
|
|
37
39
|
* const helloTask = pkg.tasks.say_hello;
|
|
38
40
|
* ```
|
|
39
41
|
*/
|
|
40
|
-
export declare function package_(name: string, version: string, ...items: (PackageItem | FunctionDef | MutationDef | PackageDef<any>)[]): PackageDef<Record<string, unknown>>;
|
|
42
|
+
export declare function package_(name: string, version: string, ...items: (PackageItem | FunctionDef | MutationDef | RecordIndexDef | MigrationDef | PackageDef<any>)[]): PackageDef<Record<string, unknown>>;
|
|
41
43
|
//# sourceMappingURL=package.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/package.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/package.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,EAGZ,MAAM,YAAY,CAAC;AAGpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAQH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,GAAG,KAAK,EAAE,CAAC,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,GACtG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4MrC"}
|