{-# LANGUAGE TypeInType #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE MultiParamTypeClasses #-} module Freelude.Impl.MakeFunctor ( -- MakeFunctor(getFunctor) ) where {- import Prelude hiding (Functor, fmap, Monad) import qualified Prelude import Data.Kind (Type) import Freelude.Impl.Classes import qualified Control.Applicative newtype MakeFunctor f a = MakeFunctor { getFunctor :: f a } data MakeFunctorP (f :: Type -> Type) type instance FunctorT (MakeFunctorP f) a = MakeFunctor f a type instance FunctorSrcC' (MakeFunctorP _) = 'Nothing type instance FunctorDstC' (MakeFunctorP _) = 'Nothing instance Prelude.Functor f => Functor FunctionP (MakeFunctorP f) where fmap f (MakeFunctor x) = MakeFunctor (Prelude.fmap f x) instance Prelude.Applicative f => Lift (MakeFunctorP f) where liftA2 f (MakeFunctor x) (MakeFunctor y) = MakeFunctor (Control.Applicative.liftA2 f x y) instance Prelude.Applicative f => Apply (MakeFunctorP f) where (MakeFunctor f) <*> (MakeFunctor x) = MakeFunctor (f Prelude.<*> x) instance Prelude.Applicative f => Pure (MakeFunctorP f) where pure x = MakeFunctor (Prelude.pure x) instance Prelude.Monad f => Monad (MakeFunctorP f) where (MakeFunctor x) >>= f = MakeFunctor (x Prelude.>>= f') where f' x' = getFunctor (f x') -}