Last active
March 24, 2021 17:08
-
-
Save iansmith/a81e01009f2ae9ff47e51ecceea12ec7 to your computer and use it in GitHub Desktop.
from article on evalvite, example 3 models from dist
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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