{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
module Examples.Account.AbstractDomain where
import Data.Map (Map)
import Data.Set (Set)
import Effect.TH
type Payment = (String, Integer, String)
type Policy =
Payment ->
Integer ->
String ->
Bool
type Account = (Integer, Set String)
data Register = Register
{ Register -> Map String Policy
policies :: Map String Policy,
Register -> Map String Account
accounts :: Map String Account
}
class (Monad m) => MonadAccounts m where
addUser :: String -> Integer -> m ()
addPolicy :: String -> Policy -> m ()
allPolicies :: m [String]
subscribeToPolicy :: String -> String -> m ()
unsubscribeToPolicy :: String -> String -> m ()
simulate :: m a -> m (Maybe a)
issuePayment :: Payment -> m ()
getUserBalance :: String -> m Integer
defineEffectType ''MonadAccounts
makeEffect ''MonadAccounts ''MonadAccountsEffect