aboutsummaryrefslogtreecommitdiff
path: root/src/fields/ScriptField.ts
diff options
context:
space:
mode:
authorLionel Han <47760119+IGoByJoe@users.noreply.github.com>2021-01-17 11:48:16 -0800
committerLionel Han <47760119+IGoByJoe@users.noreply.github.com>2021-01-17 11:48:16 -0800
commitfd4a1c602396362e9f0a1effa87fc751614e541b (patch)
tree400d22b39d3e8281f34b8834cf4c73ddc1a9551e /src/fields/ScriptField.ts
parent692e619d8775e273c32e7bde804718b3e691088b (diff)
parentf4f4cb6b3a639c3e1c0d291f1d290e80097cfa06 (diff)
changes
Diffstat (limited to 'src/fields/ScriptField.ts')
-rw-r--r--src/fields/ScriptField.ts17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/fields/ScriptField.ts b/src/fields/ScriptField.ts
index 024017302..c949e0791 100644
--- a/src/fields/ScriptField.ts
+++ b/src/fields/ScriptField.ts
@@ -7,7 +7,9 @@ import { Doc, Field, Opt } from "./Doc";
import { Plugins, setter } from "./util";
import { computedFn } from "mobx-utils";
import { ProxyField } from "./Proxy";
-import { Cast } from "./Types";
+import { Cast, NumCast } from "./Types";
+import { List } from "./List";
+import { numberRange } from "../Utils";
function optional(propSchema: PropSchema) {
return custom(value => {
@@ -188,12 +190,21 @@ export class ComputedField extends ScriptField {
const compiled = ScriptField.CompileScript(script, params, true, capturedVariables);
return compiled.compiled ? new ComputedField(compiled) : undefined;
}
- public static MakeInterpolated(fieldKey: string, interpolatorKey: string) {
+ public static MakeInterpolated(fieldKey: string, interpolatorKey: string, doc: Doc, curTimecode: number) {
+ if (!doc[`${fieldKey}-indexed`]) {
+ const flist = new List<number>(numberRange(curTimecode + 1).map(i => undefined) as any as number[]);
+ flist[curTimecode] = NumCast(doc[fieldKey]);
+ doc[`${fieldKey}-indexed`] = flist;
+ }
const getField = ScriptField.CompileScript(`getIndexVal(self['${fieldKey}-indexed'], self.${interpolatorKey})`, {}, true, {});
- const setField = ScriptField.CompileScript(`(self['${fieldKey}-indexed'])[self.${interpolatorKey}] = value`, { value: "any" }, true, {});
+ const setField = ScriptField.CompileScript(`setIndexVal(self['${fieldKey}-indexed'], self.${interpolatorKey}, value)`, { value: "any" }, true, {});
return getField.compiled ? new ComputedField(getField, setField?.compiled ? setField : undefined) : undefined;
}
}
+Scripting.addGlobal(function setIndexVal(list: any[], index: number, value: any) {
+ while (list.length <= index) list.push(undefined);
+ list[index] = value;
+}, "sets the value at a given index of a list", "(list: any[], index: number, value: any)");
Scripting.addGlobal(function getIndexVal(list: any[], index: number) {
return list?.reduce((p, x, i) => (i <= index && x !== undefined) || p === undefined ? x : p, undefined as any);