const Flume = require('flumedb') const Reduce = require('flumeview-reduce') const FlumeLog = require('flumelog-memory') const {pull, drain} = require('pull-stream') function ledger (state, emitter) { state.accounts = {} state.entries = [] const db = Flume(FlumeLog()) .use('entries', Reduce(1, entriesReducer, null, null, state.entries)) .use('accounts', Reduce(1, accountReducer, null, null, state.accounts)) .use('balances', Reduce(1, accountBalanceReducer, null, null, state.accounts)) state.db = db state.helpers = {pull, drain} pull(db.accounts.stream({live: true}), drain(acct => console.log('added:', acct))) function onLoad () { emitter.on('accounts', onEvent) emitter.on('entries', onEvent) } function onEvent (data) { db.append(data, (err, seq) => { if (err) throw err emitter.emit(state.events.RENDER) }) } emitter.on('DOMContentLoaded', onLoad) } function accountBalanceReducer (acc, item) { if (item.type !== 'entries') return acc const {msg} = item acc[msg.debit].debit += msg.amount acc[msg.credit].credit += msg.amount return acc } function entriesReducer (acc, item) { if (item.type !== 'entries') return acc acc.push(item) return acc } function accountReducer (acc, item) { // TODO account for account creation of existing account if (item.type !== 'accounts') return acc const { msg } = item if (!acc[msg.name]) { acc[msg.name] = msg return acc } Object.assign(acc[msg.name], msg) return acc } module.exports = ledger