{-# LANGUAGE CPP #-}
#if defined(__GLASGOW_HASKELL__) && (__GLASGOW_HASKELL__ >= 702)
{-# LANGUAGE Trustworthy #-}
#endif
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
-- | This module implements secrecy-only DC Labels.
module DCLabel.Secrecy ( SLabel(..) ) where

import DCLabel.Core

-- | A secrecy-only DC label.
newtype SLabel = MkSLabel DCLabel
	deriving (Eq, Show, Read)

instance ToLNF SLabel where
	toLNF (MkSLabel l) = MkSLabel (toLNF l)

instance Lattice SLabel where
  bottom = MkSLabel bottom
  top = MkSLabel top
  join (MkSLabel l1) (MkSLabel l2) = MkSLabel $
    join l1 { integrity = emptyComponent } l2 { integrity = emptyComponent }
  meet (MkSLabel l1) (MkSLabel l2) = MkSLabel $ 
    meet l1 { integrity = emptyComponent } l2 { integrity = emptyComponent }
  canflowto (MkSLabel l1) (MkSLabel l2) =
    canflowto l1 { integrity = emptyComponent } l2 { integrity = emptyComponent }

instance RelaxedLattice SLabel where
  canflowto_p p (MkSLabel l1) (MkSLabel l2) =
    canflowto_p p l1 { integrity = emptyComponent } l2 { integrity = emptyComponent }