package lu.foyer package contracts import zio.* class ContractReducer() extends Reducer[ContractEvent, ContractState]: override val fromEmpty = case e: ContractEvent.Subscribed => ContractState.subscribe(e) override val fromState = case (s: ContractState.Actif, e: ContractEvent.Amended) => s.amend(e) case (s: ContractState.Actif, _: ContractEvent.Terminated) => s.terminate() case (s: ContractState.PendingSubscription, e: ContractEvent.Amended) => s.amend(e) case (s: ContractState.PendingSubscription, _: ContractEvent.Approved) => s.approve() case (s: ContractState.PendingSubscription, _: ContractEvent.Rejected) => s.reject() case (s: ContractState.PendingSubscription, _: ContractEvent.Terminated) => s.terminate() case (s: ContractState.PendingAmendment, e: ContractEvent.Amended) => s.amend(e) case (s: ContractState.PendingAmendment, _: ContractEvent.Approved) => s.approve() case (s: ContractState.PendingAmendment, _: ContractEvent.Rejected) => s.reject() case (s: ContractState.PendingAmendment, _: ContractEvent.Terminated) => s.terminate() object ContractReducer: val layer: ULayer[Reducer[ContractEvent, ContractState]] = ZLayer.succeed(ContractReducer())