{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Monad.Identity (Identity(..)) where

newtype Identity a = Identity { Identity a -> a
runIdentity :: a } deriving Int -> Identity a -> ShowS
[Identity a] -> ShowS
Identity a -> String
(Int -> Identity a -> ShowS)
-> (Identity a -> String)
-> ([Identity a] -> ShowS)
-> Show (Identity a)
forall a. Show a => Int -> Identity a -> ShowS
forall a. Show a => [Identity a] -> ShowS
forall a. Show a => Identity a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Identity a] -> ShowS
$cshowList :: forall a. Show a => [Identity a] -> ShowS
show :: Identity a -> String
$cshow :: forall a. Show a => Identity a -> String
showsPrec :: Int -> Identity a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Identity a -> ShowS
Show

instance Functor Identity where fmap :: (a -> b) -> Identity a -> Identity b
fmap = (b -> Identity b
forall a. a -> Identity a
Identity (b -> Identity b) -> (Identity a -> b) -> Identity a -> Identity b
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Identity a -> b) -> Identity a -> Identity b)
-> ((a -> b) -> Identity a -> b)
-> (a -> b)
-> Identity a
-> Identity b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> b) -> (Identity a -> a) -> Identity a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity a -> a
forall a. Identity a -> a
runIdentity)

instance Applicative Identity where
	pure :: a -> Identity a
pure = a -> Identity a
forall a. a -> Identity a
Identity; Identity a -> b
f <*> :: Identity (a -> b) -> Identity a -> Identity b
<*> Identity a
x = b -> Identity b
forall a. a -> Identity a
Identity (b -> Identity b) -> b -> Identity b
forall a b. (a -> b) -> a -> b
$ a -> b
f a
x

instance Monad Identity where Identity a
x >>= :: Identity a -> (a -> Identity b) -> Identity b
>>= a -> Identity b
f = a -> Identity b
f a
x