on da76712 help sign in
49 lines 1.4 kB history raw
1{-# language DataKinds #-}
2{-# language StandaloneKindSignatures #-}
3{-# language TypeFamilies #-}
4{-# language TypeOperators #-}
5{-# language UndecidableInstances #-}
7module Rel8.Generic.Map
8 ( GMap
9 , Map
10 )
11where
13-- base
14import Data.Kind ( Type )
15import GHC.Generics
16 ( (:+:), (:*:), K1, M1, U1, V1
17 )
18import Prelude ()
20-- rel8
21import Rel8.FCF ( Eval, Exp )
24type GMap :: (Type -> Exp Type) -> (Type -> Type) -> Type -> Type
25type family GMap f rep where
26 GMap f (M1 i c rep) = M1 i c (GMap f rep)
27 GMap _ V1 = V1
28 GMap f (rep1 :+: rep2) = GMap f rep1 :+: GMap f rep2
29 GMap _ U1 = U1
30 GMap f (rep1 :*: rep2) = GMap f rep1 :*: GMap f rep2
31 GMap f (K1 i a) = K1 i (Eval (f a))
34-- | Map a @Type -> Type@ function over the @Type@-kinded type variables in
35-- of a type constructor.
36type Map :: (Type -> Exp Type) -> Type -> Type
37type family Map f a where
38 Map p (t a b c d e f g) =
39 t (Eval (p a)) (Eval (p b)) (Eval (p c)) (Eval (p d)) (Eval (p e))
40 (Eval (p f)) (Eval (p g))
41 Map p (t a b c d e f) =
42 t (Eval (p a)) (Eval (p b)) (Eval (p c)) (Eval (p d)) (Eval (p e))
43 (Eval (p f))
44 Map p (t a b c d e) =
45 t (Eval (p a)) (Eval (p b)) (Eval (p c)) (Eval (p d)) (Eval (p e))
46 Map p (t a b c d) = t (Eval (p a)) (Eval (p b)) (Eval (p c)) (Eval (p d))
47 Map p (t a b c) = t (Eval (p a)) (Eval (p b)) (Eval (p c))
48 Map p (t a b) = t (Eval (p a)) (Eval (p b))
49 Map p (t a) = t (Eval (p a))