threads-0.1.0.1: Control/Concurrent/Thread/Internal.hs
{-# LANGUAGE DeriveDataTypeable, NoImplicitPrelude, UnicodeSyntax #-}
module Control.Concurrent.Thread.Internal
( ThreadId( ThreadId )
, result, threadId
) where
-------------------------------------------------------------------------------
-- Imports
-------------------------------------------------------------------------------
-- from base:
import Control.Exception ( SomeException )
import Data.Eq ( Eq, (==) )
import Data.Either ( Either )
import Data.Function ( on )
import Data.Ord ( Ord, compare )
import Data.Typeable ( Typeable )
import Text.Show ( Show, show )
import qualified Control.Concurrent as C ( ThreadId )
-- from base-unicode-symbols:
import Data.Function.Unicode ( (∘) )
-- from stm:
import Control.Concurrent.STM.TMVar ( TMVar )
-------------------------------------------------------------------------------
-- ThreadIds
-------------------------------------------------------------------------------
{-|
A @'ThreadId' α@ is an abstract type representing a handle to a thread
that is executing or has executed a computation of type @'IO' α@.
-}
data ThreadId α = ThreadId
{ result ∷ TMVar (Either SomeException α)
, threadId ∷ C.ThreadId -- ^ Extract the native
-- @Control.Concurrent.'C.ThreadId'@.
} deriving Typeable
instance Eq (ThreadId α) where
(==) = (==) `on` threadId
-- | The @Ord@ instance implements an arbitrary total ordering over 'ThreadId's.
instance Ord (ThreadId α) where
compare = compare `on` threadId
{-|
The @Show@ instance lets you convert an arbitrary-valued 'ThreadId' to string
form; showing a 'ThreadId' value is occasionally useful when debugging or
diagnosing the behaviour of a concurrent program.
-}
instance Show (ThreadId α) where
show = show ∘ threadId
-- The End ---------------------------------------------------------------------