packages feed

keiro-dsl-0.2.0.0: test/conformance-coldstart/Billing/Subscription/Holes.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE QualifiedDo #-}
{-# LANGUAGE TypeApplications #-}

-- HAND-FILLED hole module for the EP-7 cold-start demo: a fresh `subscription`
-- aggregate authored from only the skill notation, then filled against the
-- generated signatures. The harness pins this fill.
module Billing.Subscription.Holes (
    subscriptionTransducer,
    applySubscriptions,
) where

import Generated.Billing.Subscription.Domain
import Keiki.Builder ((=:))
import Keiki.Builder qualified as B
import Keiki.Core (HsPred, SymTransducer, lit, (./=))

subscriptionTransducer ::
    SymTransducer
        (HsPred SubscriptionRegs SubscriptionCommand)
        SubscriptionRegs
        SubscriptionVertex
        SubscriptionCommand
        SubscriptionEvent
subscriptionTransducer =
    B.buildTransducer SubscriptionInactive initialSubscriptionRegs isTerminal do
        B.from SubscriptionInactive do
            B.onCmd inCtorActivateSubscription $ \d -> B.do
                B.requireGuard (d.plan ./= lit Free)
                B.slot @"subscriptionState" =: lit SubscriptionActive
                B.emit
                    wireSubscriptionActivated
                    SubscriptionActivatedTermFields
                        { subscriptionId = d.subscriptionId
                        , customerId = d.customerId
                        , plan = d.plan
                        }
                B.goto SubscriptionActive
        B.from SubscriptionActive do
            B.onCmd inCtorCancelSubscription $ \d -> B.do
                B.slot @"subscriptionState" =: lit SubscriptionClosed
                B.emit
                    wireSubscriptionCancelled
                    SubscriptionCancelledTermFields
                        { subscriptionId = d.subscriptionId
                        , customerId = d.customerId
                        }
                B.goto SubscriptionClosed
  where
    isTerminal = \case
        SubscriptionClosed -> True
        _ -> False

applySubscriptions :: SubscriptionEvent -> recorded -> txn ()
applySubscriptions _event _recorded = error "HOLE: fill subscriptions projection apply"