mgeneric-0.0.0.2: Generics with multiple parameters

Safe HaskellNone
LanguageHaskell2010

Data.MFunctor

Synopsis

Documentation

data Variance Source

Variance kind used in MFunctor

Constructors

CoV

Variance for covariant parameters

ContraV

Variance for contravariant parameters

Instances

MFunctor * Bool ([] *) ([] Variance) 
MFunctor * Ordering ([] *) ([] Variance) 
MFunctor * () ([] *) ([] Variance) 
AdaptFieldFunction ([] (Field *)) ([] Variance) ps vs 
GFPMFunctor [Variance] n as vs => GFPMFunctor [Variance] (NS n) ((:) * (a -> b) as) ((:) Variance ContraV vs) 
GFPMFunctor [Variance] n as vs => GFPMFunctor [Variance] (NS n) ((:) * (a -> b) as) ((:) Variance CoV vs) 
MFunctor (* -> * -> * -> * -> * -> * -> * -> * -> * -> *) (,,,,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ((:) * (g -> g') ((:) * (h -> h') ((:) * (i -> i') ([] *)))))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))))))))) 
MFunctor (* -> * -> * -> * -> * -> * -> * -> * -> *) (,,,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ((:) * (g -> g') ((:) * (h -> h') ([] *))))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance))))))))) 
MFunctor (* -> * -> * -> * -> * -> * -> * -> *) (,,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ((:) * (g -> g') ([] *)))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))))))) 
MFunctor (* -> * -> * -> * -> * -> * -> *) (,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ([] *))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance))))))) 
MFunctor (* -> * -> * -> * -> * -> *) (,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ([] *)))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))))) 
MFunctor (* -> * -> * -> * -> *) (,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ([] *))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance))))) 
MFunctor (* -> * -> * -> *) (,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ([] *)))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))) 
MFunctor (* -> * -> *) (->) ((:) * (a' -> a) ((:) * (b -> b') ([] *))) ((:) Variance ContraV ((:) Variance CoV ([] Variance))) 
MFunctor (* -> * -> *) Either ((:) * (a -> a') ((:) * (b -> b') ([] *))) ((:) Variance CoV ((:) Variance CoV ([] Variance))) 
MFunctor (* -> * -> *) (,) ((:) * (a -> a') ((:) * (b -> b') ([] *))) ((:) Variance CoV ((:) Variance CoV ([] Variance))) 
MFunctor (* -> *) [] ((:) * (a -> a') ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Sum ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Product ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) First ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Last ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Maybe ((:) * (a -> a') ([] *)) ((:) Variance CoV ([] Variance)) 
(MFunctor k f (ExpandFieldFunction bs (FlipVariance vs') ps vs) vs', (~) [*] (ExpandFields bs (Domains ps vs)) (Codomains (ExpandFieldFunction bs (FlipVariance vs') ps vs) vs'), (~) [*] (ExpandFields bs (Codomains ps vs)) (Domains (ExpandFieldFunction bs (FlipVariance vs') ps vs) vs'), AdaptFieldFunction bs (FlipVariance vs') ps vs, AdaptFieldFunction as vfs ps vs) => AdaptFieldFunction ((:) (Field *) ((:@:) * k f bs) as) ((:) Variance ContraV vfs) ps vs 
(MFunctor k f (ExpandFieldFunction bs vs' ps vs) vs', (~) [*] (ExpandFields bs (Codomains ps vs)) (Codomains (ExpandFieldFunction bs vs' ps vs) vs'), (~) [*] (ExpandFields bs (Domains ps vs)) (Domains (ExpandFieldFunction bs vs' ps vs) vs'), AdaptFieldFunction bs vs' ps vs, AdaptFieldFunction as vfs ps vs) => AdaptFieldFunction ((:) (Field *) ((:@:) * k f bs) as) ((:) Variance CoV vfs) ps vs 
(GFPMFunctor [Variance] n ps vs, AdaptFieldFunction as vfs ps vs, (~) * (Flip ((:!:) * ps n)) ((:!:) * (Domains ps vs) n -> (:!:) * (Codomains ps vs) n)) => AdaptFieldFunction ((:) (Field *) (FP * n) as) ((:) Variance ContraV vfs) ps vs 
(GFPMFunctor [Variance] n ps vs, AdaptFieldFunction as vfs ps vs, (~) * ((:!:) * ps n) ((:!:) * (Domains ps vs) n -> (:!:) * (Codomains ps vs) n)) => AdaptFieldFunction ((:) (Field *) (FP * n) as) ((:) Variance CoV vfs) ps vs 
AdaptFieldFunction as vfs ps vs => AdaptFieldFunction ((:) (Field *) (FK * a) as) ((:) Variance v vfs) ps vs 

type family Domains fs vs Source

Domain (a -> b) CoV ~ a
Domain (a -> b) ContraV ~ b
Domains fs vs ~ Map (Uncurry Domain) (Zip fs vs)

Equations

Domains [] [] = [] 
Domains ((a -> b) : as) (CoV : vs) = a : Domains as vs 
Domains ((a -> b) : as) (ContraV : vs) = b : Domains as vs 

type family Codomains fs vs Source

Codomain (a -> b) CoV ~ b
Codomain (a -> b) ContraV ~ a
Codomains fs vs ~ Map (Uncurry Codomain) (Zip fs vs)

Equations

Codomains [] [] = [] 
Codomains ((a -> b) : as) (CoV : vs) = b : Codomains as vs 
Codomains ((a -> b) : as) (ContraV : vs) = a : Codomains as vs 

class MFunctor f fs vs | f -> vs, fs -> k, vs -> k where Source

MFunctor type class, generalisation of Functor, Bifunctor, Contravariant, Profunctor, etc.

If f has a MGeneric instance, and types that appear in f have a MFunctor instance, it is possible to derive a MFunctor instance for f.

>>> instance MFunctor [] '[a -> a'] '[CoV]
>>> instance MFunctor (->) '[a' -> a, b -> b'] '[ContraV, CoV]

Minimal complete definition

Nothing

Methods

mmapP :: Proxy f -> Proxy vs -> HList fs -> (f :$: Domains fs vs) -> f :$: Codomains fs vs Source

see mmap

Instances

MFunctor * Bool ([] *) ([] Variance) 
MFunctor * Ordering ([] *) ([] Variance) 
MFunctor * () ([] *) ([] Variance) 
MFunctor (* -> * -> * -> * -> * -> * -> * -> * -> * -> *) (,,,,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ((:) * (g -> g') ((:) * (h -> h') ((:) * (i -> i') ([] *)))))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))))))))) 
MFunctor (* -> * -> * -> * -> * -> * -> * -> * -> *) (,,,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ((:) * (g -> g') ((:) * (h -> h') ([] *))))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance))))))))) 
MFunctor (* -> * -> * -> * -> * -> * -> * -> *) (,,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ((:) * (g -> g') ([] *)))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))))))) 
MFunctor (* -> * -> * -> * -> * -> * -> *) (,,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ((:) * (f -> f') ([] *))))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance))))))) 
MFunctor (* -> * -> * -> * -> * -> *) (,,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ((:) * (e -> e') ([] *)))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))))) 
MFunctor (* -> * -> * -> * -> *) (,,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ((:) * (d -> d') ([] *))))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance))))) 
MFunctor (* -> * -> * -> *) (,,) ((:) * (a -> a') ((:) * (b -> b') ((:) * (c -> c') ([] *)))) ((:) Variance CoV ((:) Variance CoV ((:) Variance CoV ([] Variance)))) 
MFunctor (* -> * -> *) (->) ((:) * (a' -> a) ((:) * (b -> b') ([] *))) ((:) Variance ContraV ((:) Variance CoV ([] Variance))) 
MFunctor (* -> * -> *) Either ((:) * (a -> a') ((:) * (b -> b') ([] *))) ((:) Variance CoV ((:) Variance CoV ([] Variance))) 
MFunctor (* -> * -> *) (,) ((:) * (a -> a') ((:) * (b -> b') ([] *))) ((:) Variance CoV ((:) Variance CoV ([] Variance))) 
MFunctor (* -> *) [] ((:) * (a -> a') ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Sum ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Product ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) First ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Last ((:) * (a -> b) ([] *)) ((:) Variance CoV ([] Variance)) 
MFunctor (* -> *) Maybe ((:) * (a -> a') ([] *)) ((:) Variance CoV ([] Variance)) 

mmap :: forall a b f fs vs. (Unapply a f (Domains fs vs), Unapply b f (Codomains fs vs), MFunctor f fs vs) => HList fs -> a -> b Source

Proxy-less mmapP, generalisation of fmap, bimap, contramap, dimap, etc.

If f is covariant in all its parameters (its variances are '[CoV, CoV, ..., CoV]) :

mmap :: HList '[a1 -> b1, ..., an -> bn] -> f a1 ... an -> f b1 ... bn

e.g. when f is contravariant in some parameters (variances of (->) are '[ContraV, CoV])

mmap :: HList '[b1 -> a1, a2 -> b2] -> (a1 -> a2) -> (b1 -> b2)