import type { AggregateEvent } from '#event/AggregateEvent.ts'
import type { AggregateMeta } from '../AggregateMeta.ts'
import type { ApplyEventFn, ApplyEventsFn } from './ApplyEventsFn.ts'
export const reduceEvents =
& { $meta: AggregateMeta }>(
applyEvent: ApplyEventFn,
): ApplyEventsFn =>
(events: Array, aggregate?: A) => {
let updatedAggregate = aggregate
let n = 0
let event: AggregateEvent | undefined = events[n]
do {
if (event === undefined) throw new Error('No events to reduce!')
updatedAggregate = applyEvent(event, updatedAggregate)
event = events[++n]
} while (event !== undefined)
if (updatedAggregate === undefined)
throw new Error(`Failed to reduce events: ${JSON.stringify(events)}`)
return updatedAggregate
}