tagged-0.0: Data/Tagged.hs
----------------------------------------------------------------------------
-- |
-- Module : Data.Tagged
-- Copyright : 2009 Edward Kmett
-- License : BSD3
--
-- Maintainer : Edward Kmett <ekmett@gmail.com>
-- 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 #-}