{-# 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