{-# LANGUAGE TypeFamilies, UndecidableInstances #-}

module PrioritySync.Internal.Receipt
    (Receipt(..))
    where

import PrioritySync.Internal.UserData
import PrioritySync.Internal.RoomGroup
import PrioritySync.Internal.ClaimContext
import Control.Concurrent.STM

-- | Get a notification when a claim is approved or scheduled.
data Receipt c = Receipt {
    receipt_base_context :: c,
    receipt_entering_callback, receipt_exiting_callback :: ClaimHandle c -> STM () }

type instance UserData (Receipt c) = UserData c

instance (RoomGroup c) => RoomGroup (Receipt c) where
    roomsOf r = roomsOf $ receipt_base_context r

instance (ClaimContext c) => ClaimContext (Receipt c) where
    type ClaimHandle (Receipt c) = ClaimHandle c
    approveClaimsEntering r cs =
        do result <- approveClaimsEntering (receipt_base_context r) cs
           receipt_entering_callback r $ result
           return result
    approveClaimsExiting r cs =
        do result <- approveClaimsExiting (receipt_base_context r) cs
           receipt_exiting_callback r $ result
           return result
    waitingAction r = waitingAction $ receipt_base_context r