{-# LANGUAGE RankNTypes, TypeFamilies, TypeFamilyDependencies, TypeInType #-}
module NAryFunctor
( NFunctor(..)
, NMap1(..), NMap
) where
import Data.Bifunctor
import Data.Functor.Identity
import Data.Kind (Type)
class NFunctor (f :: k) where
nmap :: NMap k f f
newtype NMap1 k (f :: Type -> k) (f' :: Type -> k) = NMap1
{ (<#>) :: forall a b. (a -> b) -> NMap k (f a) (f' b)
}
type family NMap k = (r :: k -> k -> Type) | r -> k where
NMap Type = (->)
NMap (Type -> k) = NMap1 k
instance NFunctor (Either a) where
nmap = NMap1 fmap
instance NFunctor Either where
nmap = NMap1 $ \f1 -> NMap1 $ \f2 -> bimap f1 f2
instance NFunctor () where
nmap = id
instance NFunctor Identity where
nmap = NMap1 $ \f1
-> \(Identity x1)
-> Identity (f1 x1)
instance NFunctor (,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> \(x1,x2)
-> (f1 x1, f2 x2)
instance NFunctor (,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> \(x1,x2,x3)
-> (f1 x1, f2 x2, f3 x3)
instance NFunctor (,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> \(x1,x2,x3,x4)
-> (f1 x1, f2 x2, f3 x3, f4 x4)
instance NFunctor (,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> \(x1,x2,x3,x4,x5)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5)
instance NFunctor (,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> \(x1,x2,x3,x4,x5,x6)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6)
instance NFunctor (,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> \(x1,x2,x3,x4,x5,x6,x7)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7)
instance NFunctor (,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> \(x1,x2,x3,x4,x5,x6,x7,x8)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8)
instance NFunctor (,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9)
instance NFunctor (,,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> NMap1 $ \f10
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9, f10 x10)
instance NFunctor (,,,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> NMap1 $ \f10
-> NMap1 $ \f11
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9, f10 x10, f11 x11)
instance NFunctor (,,,,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> NMap1 $ \f10
-> NMap1 $ \f11
-> NMap1 $ \f12
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9, f10 x10, f11 x11, f12 x12)
instance NFunctor (,,,,,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> NMap1 $ \f10
-> NMap1 $ \f11
-> NMap1 $ \f12
-> NMap1 $ \f13
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9, f10 x10, f11 x11, f12 x12, f13 x13)
instance NFunctor (,,,,,,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> NMap1 $ \f10
-> NMap1 $ \f11
-> NMap1 $ \f12
-> NMap1 $ \f13
-> NMap1 $ \f14
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9, f10 x10, f11 x11, f12 x12, f13 x13, f14 x14)
instance NFunctor (,,,,,,,,,,,,,,) where
nmap = NMap1 $ \f1
-> NMap1 $ \f2
-> NMap1 $ \f3
-> NMap1 $ \f4
-> NMap1 $ \f5
-> NMap1 $ \f6
-> NMap1 $ \f7
-> NMap1 $ \f8
-> NMap1 $ \f9
-> NMap1 $ \f10
-> NMap1 $ \f11
-> NMap1 $ \f12
-> NMap1 $ \f13
-> NMap1 $ \f14
-> NMap1 $ \f15
-> \(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15)
-> (f1 x1, f2 x2, f3 x3, f4 x4, f5 x5, f6 x6, f7 x7, f8 x8, f9 x9, f10 x10, f11 x11, f12 x12, f13 x13, f14 x14, f15 x15)