-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathAggregate.hs
76 lines (69 loc) · 4.08 KB
/
Aggregate.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
-- https://downloads.haskell.org/ghc/latest/docs/users_guide/using-warnings.html#ghc-flag--Wmissing-deriving-strategies
{-# OPTIONS_GHC -Wno-missing-deriving-strategies #-}
-- https://downloads.haskell.org/ghc/latest/docs/users_guide/using-warnings.html#ghc-flag--Wunticked-promoted-constructors
{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-}
-- https://downloads.haskell.org/ghc/latest/docs/users_guide/using-warnings.html#ghc-flag--Wunused-type-patterns
{-# OPTIONS_GHC -Wno-unused-type-patterns #-}
module Crem.Example.RiskManager.Aggregate where
import Crem.BaseMachine
import Crem.Example.RiskManager.Domain
import Crem.Render.RenderableVertices (AllVertices (..), RenderableVertices)
import Crem.Topology
import "singletons-base" Data.Singletons.Base.TH
$( singletons
[d|
data AggregateVertex
= NoDataVertex
| CollectedUserDataVertex
| CollectedLoanDetailsFirstVertex
| ReceivedCreditBureauDataFirstVertex
| CollectedAllDataVertex
deriving stock (Eq, Show, Enum, Bounded)
aggregateTopology :: Topology AggregateVertex
aggregateTopology =
Topology
[ (NoDataVertex, [CollectedUserDataVertex])
, (CollectedUserDataVertex, [CollectedLoanDetailsFirstVertex, ReceivedCreditBureauDataFirstVertex])
, (CollectedLoanDetailsFirstVertex, [CollectedAllDataVertex])
, (ReceivedCreditBureauDataFirstVertex, [CollectedAllDataVertex])
, (CollectedAllDataVertex, [])
]
|]
)
deriving via AllVertices AggregateVertex instance RenderableVertices AggregateVertex
data AggregateState (vertex :: AggregateVertex) where
NoData :: AggregateState 'NoDataVertex
CollectedUserData :: UserData -> AggregateState 'CollectedUserDataVertex
CollectedLoanDetailsFirst :: UserData -> LoanDetails -> AggregateState 'CollectedLoanDetailsFirstVertex
ReceivedCreditBureauDataFirst :: UserData -> CreditBureauData -> AggregateState 'ReceivedCreditBureauDataFirstVertex
CollectedAllData :: UserData -> LoanDetails -> CreditBureauData -> AggregateState 'CollectedAllDataVertex
riskAggregate :: BaseMachine AggregateTopology RiskCommand (Maybe RiskEvent)
riskAggregate =
BaseMachineT
{ initialState = InitialState NoData
, action = \case
NoData -> \case
RegisterUserData ud -> pureResult (Just $ UserDataRegistered ud) (CollectedUserData ud)
_ -> pureResult Nothing NoData
CollectedUserData ud -> \case
RegisterUserData ud' -> pureResult (Just $ UserDataRegistered ud') (CollectedUserData ud')
ProvideLoanDetails ld -> pureResult (Just $ LoanDetailsProvided ld) (CollectedLoanDetailsFirst ud ld)
ProvideCreditBureauData cbd -> pureResult (Just $ CreditBureauDataReceived cbd) (ReceivedCreditBureauDataFirst ud cbd)
CollectedLoanDetailsFirst ud ld -> \case
RegisterUserData ud' -> pureResult (Just $ UserDataRegistered ud') (CollectedLoanDetailsFirst ud' ld)
ProvideLoanDetails ld' -> pureResult (Just $ LoanDetailsProvided ld') (CollectedLoanDetailsFirst ud ld')
ProvideCreditBureauData cbd -> pureResult (Just $ CreditBureauDataReceived cbd) (CollectedAllData ud ld cbd)
ReceivedCreditBureauDataFirst ud cbd -> \case
RegisterUserData ud' -> pureResult (Just $ UserDataRegistered ud') (ReceivedCreditBureauDataFirst ud' cbd)
ProvideLoanDetails ld -> pureResult (Just $ LoanDetailsProvided ld) (CollectedAllData ud ld cbd)
ProvideCreditBureauData cbd' -> pureResult (Just $ CreditBureauDataReceived cbd') (ReceivedCreditBureauDataFirst ud cbd')
CollectedAllData ud ld cbd -> \case
RegisterUserData ud' -> pureResult (Just $ UserDataRegistered ud') (CollectedAllData ud' ld cbd)
ProvideLoanDetails ld' -> pureResult (Just $ LoanDetailsProvided ld') (CollectedAllData ud ld' cbd)
ProvideCreditBureauData cbd' -> pureResult (Just $ CreditBureauDataReceived cbd') (CollectedAllData ud ld cbd')
}