----------------------------------------------------------------------------
-- |
-- 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 #-}