-- |
-- Module      : Basement.Compat.Identity
-- License     : BSD-style
-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
-- Stability   : experimental
-- Portability : portable
--
-- Identity re-export, with a compat wrapper for older version of base that
-- do not have Data.Functor.Identity
{-# LANGUAGE CPP #-}
module Basement.Compat.Identity
    ( Identity(..)
    ) where

#if MIN_VERSION_base(4,8,0)

import Data.Functor.Identity

#else

import Basement.Compat.Base

newtype Identity a = Identity { runIdentity :: a }
    deriving (Eq, Ord)

instance Functor Identity where
    fmap f (Identity a) = Identity (f a)

instance Applicative Identity where
    pure a = Identity a
    (<*>) fab fa = Identity $ runIdentity fab (runIdentity fa)

instance Monad Identity where
    return    = pure
    ma >>= mb = mb (runIdentity ma)

#endif