const Flume = require('flumedb') const Reduce = require('flumeview-reduce') const FlumeLog = require('flumelog-memory') function ledger (state, emitter) { state.accounts = {} state.transactions = [] const db = Flume(FlumeLog()) .use('transactions', Reduce( 1, transactionReducer, null, null, state.transactions)) .use('account', Reduce( 1, accountReducer, null, null, state.accounts)) state.db = db function transactionReducer (acc, item) { if (item.type !== 'transaction') return acc acc.push(item) return acc } function accountReducer (acc, item) { if (item.type !== 'accounts') return acc const {msg} = item switch (msg.type) { case 'TOGGLE': acc[msg.name].archived = !acc[msg.name].archived return acc default: acc[msg.name] = msg return acc } } function onLoad () { emitter.on('account', onEvent) emitter.on('transaction:add', onEvent) } function onEvent (data) { db.append(data, (err, seq) => { if (err) throw err emitter.emit(state.events.RENDER) }) } emitter.on('DOMContentLoaded', onLoad) } module.exports = ledger