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