module Data.Pass.Fun
( Fun(..)
) where
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(x,y,z) 1
#endif
import Data.Hashable
import Data.Typeable
import Data.Pass.Named
import Data.Pass.Call
import Data.Pass.Trans
import Data.Pass.L.By
import Data.Pass.Eval
import Data.Pass.Eval.Naive
newtype Fun k a b = Fun { unFun :: k a b }
instance Trans Fun where
trans = Fun
instance Named k => Show (Fun k a b) where
showsPrec = showsFun
instance Typeable2 k => Typeable2 (Fun k) where
typeOf2 (_ :: Fun k a b) = mkTyConApp funTyCon [typeOf2 (undefined :: k a b)]
funTyCon :: TyCon
#if MIN_VERSION_base(4,4,0)
funTyCon = mkTyCon3 "pass" "Data.Pass.Fun" "Fun"
#else
funTyCon = mkTyCon "Data.Pass.Fun.Fun"
#endif
instance Named k => Named (Fun k) where
showsFun d (Fun f) = showParen (d > 10) $ showString "Fun " . showsFun 10 f
hashFunWithSalt i (Fun k) = hashFunWithSalt i k
equalFun (Fun f) (Fun g) = equalFun f g
putFun (Fun f) = putFun f
instance Call k => Call (Fun k) where
call (Fun k) = call k
instance Named k => Eq (Fun k a b) where
(==) = equalFun
instance Named k => Hashable (Fun k a b) where
hashWithSalt = hashFunWithSalt
instance Naive k => Naive (Fun k) where
naive (Fun k) = naive k
instance Eval k => Eval (Fun k) where
eval (Fun k) = eval k
instance By k => By (Fun k) where
by (Fun k) r = Fun (by k r)