{-# LANGUAGE Unsafe #-} {- | This module exports 'LabeledResult's which are effectively thread exit results protected by a label. See "LIO.Concurrent" for a description of the concurrency abstractions of LIO. -} module LIO.Concurrent.TCB ( LabeledResult(..), ThreadId ) where import LIO.Label import LIO.Core import LIO.Concurrent.LMVar import Control.Concurrent -- | A labeled thread result is simply a wrapper for a 'LMVar'. A thread -- can observe the result of another thread, only after raising its label -- to the label of the result. data LabeledResult l a = LabeledResultTCB { lresThreadIdTCB :: ThreadId -- ^ Thread executing the computation , lresResultTCB :: LMVar l (Either (LabeledException l) a) -- ^ Plecement of computation result } instance LabelOf LabeledResult where labelOf = labelOf . lresResultTCB