Skip to content

Instantly share code, notes, and snippets.

@iansmith
Last active March 24, 2021 17:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iansmith/a81e01009f2ae9ff47e51ecceea12ec7 to your computer and use it in GitHub Desktop.
Save iansmith/a81e01009f2ae9ff47e51ecceea12ec7 to your computer and use it in GitHub Desktop.
from article on evalvite, example 3 models from dist
// file: example3/models.ts
// model for one input box
export interface NumberModelItem {
[key: string]: any;
value: Attribute<number>;
}
// … other models omitted
export default class NumberModel {
[key: string]: any;
// array content has to be an object, can't be just ArrayAttribute<number>; see NaiveArrayAttribute if you want to do an array of number
content: ArrayAttribute<NumberModelItem>;
isDefined: Attribute<boolean>;
number: Attribute<number>;
average: Attribute<number>;
sum: Attribute<number>;
max: Attribute<number>;
constructor() {
this.content = ev.array<NumberModelItem>("content");
// how many items
this.number = ev.computed<number>(
(values: NumberStateItem[]) => {
return values.length;
},
[this.content],
"number"
);
// is it zero length?
this.isDefined = ev.computed<boolean>(
(n: number): boolean => {
return n > 0;
},
[this.number],
"isDefined"
);
// sum
this.sum = ev.computed<number>(
(values: NumberStateItem[]) =>
values
.map((nm: NumberStateItem) => nm.value)
.reduce((prev: number, curr: number) => prev + curr, 0),
[this.content],
"sum"
);
// avg
this.average = ev.computed<number>(
(total: number, howMany: number, divisionOK: boolean): number => {
if (divisionOK) {
return total / howMany;
}
return 0; // won't matter, user will not see this
},
[this.sum, this.number, this.isDefined],
"average"
);
// max
this.max = ev.computed<number>(
(values: NumberStateItem[]): number => {
return values
.map((nm: NumberStateItem) => nm.value)
.reduce(
(prev: number, curr: number) => (prev > curr ? prev : curr),
0
);
},
[this.content],
"max"
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment