{-# LANGUAGE Trustworthy #-} -- | Labeled expressions. module MAC.Labeled ( Labeled () , Id (MkId, unId) , label , unlabel ) where import MAC.Lattice import MAC.Core (MAC(), Res()) import MAC.Effects -- | Type denoting values of type @a@ newtype Id a = MkId { unId :: a } -- | Labeled expressions type Labeled l a = Res l (Id a) -- | Creation of labeled expressions label :: Less l l' => a -> MAC l (Labeled l' a) label = create . return . MkId -- | Observing labeled expressions unlabel :: Less l' l => Labeled l' a -> MAC l a unlabel = readdown (return . unId)