packages feed

crem-0.1.0.0: examples/Crem/Example/RiskManager/Application.hs

module Crem.Example.RiskManager.Application where

import Crem.Example.RiskManager.Aggregate (riskAggregate)
import Crem.Example.RiskManager.Domain (RiskCommand, RiskEvent)
import Crem.Example.RiskManager.Policy (riskPolicy)
import Crem.Example.RiskManager.Projection (ReceivedData, riskProjection)
import Crem.StateMachine
import "base" Data.List (singleton)
import "base" Data.Maybe (maybeToList)
import "profunctors" Data.Profunctor (rmap)
import Prelude hiding ((.))

aggregate :: StateMachine RiskCommand [RiskEvent]
aggregate = rmap maybeToList $ Basic riskAggregate

policy :: StateMachine RiskEvent [RiskCommand]
policy = rmap maybeToList riskPolicy

writeModel :: StateMachine RiskCommand [RiskEvent]
writeModel = Feedback aggregate policy

projection :: StateMachine RiskEvent ReceivedData
projection = Basic riskProjection

readModel :: StateMachine RiskEvent [ReceivedData]
readModel = rmap singleton projection

whole :: StateMachine RiskCommand [ReceivedData]
whole = Kleisli writeModel readModel

riskApplication :: StateMachine RiskCommand ReceivedData
riskApplication = rmap mconcat whole