(CPU) Efficient List Summing via streams
const stream = require('mithril/stream')
const scan = require('mithril/stream/scan')
const R = require('ramda')
var initialList = R.range(0, 10000)
var inserts = stream()
// the list is just the sum of all inserts
var list = scan(function(list, { index, value }){
return [].concat(
list.slice(0, index),
value,
list.slice(index+1)
)
}, initialList, inserts )
// we need to store the previous list
// to obtain the old value in the sum stream
var pairs = scan(R.pipe(
R.flip(R.append)
,R.takeLast(2)
), [initialList, initialList], list )
var prevList = pairs.map(R.head)
var sum = scan(function(sum, [list, { index, value }]){
const oldValue = list[index] || 0
return sum - oldValue + value
}, R.sum( initialList), stream.merge([ prevList, inserts ]) )
null
const sums = scan( R.flip( R.append ), [], sum.map( R.of ))
// sum=49995000
inserts({ index: 5000, value: 5000 }) //sum = 49995000
inserts({ index: 5000, value: 0 })//sum = 49990000
inserts({ index: 5000, value: 0 })//sum = 49990000
inserts({ index: 0, value: 1 }) //sum = 49990001
sums().join(', ')
no comments