57 lines
1.2 KiB
Plaintext
57 lines
1.2 KiB
Plaintext
type State {
|
|
source: Json
|
|
update: Bool
|
|
checksum: Int
|
|
}
|
|
|
|
run(source: Json, update: Bool, ticks: Text) (sample: Sample) {
|
|
input = dever.bytes.fromText(ticks)
|
|
initial = State {
|
|
source = source
|
|
update = update
|
|
checksum = 0
|
|
}
|
|
output = transform(source, update)
|
|
begin = dever.time.monotonicNanos()
|
|
final = reduce(step, input, initial)
|
|
end = dever.time.monotonicNanos()
|
|
sample = Sample {
|
|
elapsed_ns = end - begin
|
|
checksum = final.checksum
|
|
output = output
|
|
}
|
|
}
|
|
|
|
type Sample {
|
|
elapsed_ns: Int
|
|
checksum: Int
|
|
output: Text
|
|
}
|
|
|
|
step(unused: Int, state: State) (next: State) {
|
|
output = transform(state.source, state.update)
|
|
next = State {
|
|
source = state.source
|
|
update = state.update
|
|
checksum = state.checksum + length(dever.bytes.fromText(output))
|
|
}
|
|
}
|
|
|
|
transform(source: Json, update: false) (output: Text) {
|
|
output = selected(dever.json.propertyValue(source, "data"))
|
|
}
|
|
|
|
transform(source: Json, update: true) (output: Text) {
|
|
output = dever.json.toText(
|
|
dever.json.setProperty(source, "active", dever.json.boolean(true))
|
|
)
|
|
}
|
|
|
|
selected(value: Json) (output: Text) {
|
|
output = dever.json.toText(value)
|
|
}
|
|
|
|
selected(value: null) (output: Text) {
|
|
output = "null"
|
|
}
|