---------------------------------------------------------------------------- -- | -- Module : Data.Tagged -- Copyright : 2009 Edward Kmett -- License : BSD3 -- -- Maintainer : Edward Kmett -- Stability : experimental -- Portability : portable -- ------------------------------------------------------------------------------- module Data.Tagged ( Tagged(..) , retag ) where import Control.Applicative newtype Tagged a b = Tagged { unTagged :: b } deriving (Eq,Ord,Show,Read) instance Functor (Tagged a) where fmap f (Tagged x) = Tagged (f x) {-# INLINE fmap #-} instance Applicative (Tagged a) where pure = Tagged {-# INLINE pure #-} Tagged f <*> Tagged x = Tagged (f x) {-# INLINE (<*>) #-} instance Monad (Tagged a) where return = Tagged {-# INLINE return #-} Tagged m >>= k = k m {-# INLINE (>>=) #-} _ >> n = n {-# INLINE (>>) #-} retag :: Tagged f b -> Tagged g b retag = Tagged . unTagged {-# INLINE retag #-}