1-- |
2-- Module      : Basement.Compat.Identity
3-- License     : BSD-style
4-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
5-- Stability   : experimental
6-- Portability : portable
7--
8-- Identity re-export, with a compat wrapper for older version of base that
9-- do not have Data.Functor.Identity
10{-# LANGUAGE CPP #-}
11module Basement.Compat.Identity
12    ( Identity(..)
13    ) where
14
15#if MIN_VERSION_base(4,8,0)
16
17import Data.Functor.Identity
18
19#else
20
21import Basement.Compat.Base
22
23newtype Identity a = Identity { runIdentity :: a }
24    deriving (Eq, Ord)
25
26instance Functor Identity where
27    fmap f (Identity a) = Identity (f a)
28
29instance Applicative Identity where
30    pure a = Identity a
31    (<*>) fab fa = Identity $ runIdentity fab (runIdentity fa)
32
33instance Monad Identity where
34    return    = pure
35    ma >>= mb = mb (runIdentity ma)
36
37#endif
38