{-# LANGUAGE TypeFamilies #-} module PrioritySync.Internal.ClaimContext (ClaimContext(..)) where import PrioritySync.Internal.UserData import PrioritySync.Internal.RoomCore import Control.Concurrent.STM -- | Rules for calling 'claim_'. class ClaimContext c where type ClaimHandle c :: * -- | Should approve a some claims before entering a critical section, as described by 'claim_'. approveClaimsEntering :: c -> [Claim (UserData c)] -> STM (ClaimHandle c) -- | Should approve a some claims before exiting a critical section, as described by 'claim_'. approveClaimsExiting :: c -> [Claim (UserData c)] -> STM (ClaimHandle c) -- | A waiting transaction, as described by 'claim_'. waitingAction :: c -> ClaimHandle c -> STM () instance (ClaimContext c) => ClaimContext (c,m) where type ClaimHandle (c,m) = ClaimHandle c approveClaimsEntering = approveClaimsEntering . fst approveClaimsExiting = approveClaimsExiting . fst waitingAction = waitingAction . fst