--
class (UnPatDa (PatDa w) ~ w) => Pat (w :: PKind) where
-- | Any data this witness needs to carry around
- data PatDa w :: *
+ type PatDa w :: *
-- | The type this witness witnesses (i.e. the things matched against)
type PatTy w :: *
-- | The type this witness binds (i.e. after matching is done)
type PatReprFn (r :: * -> *) w :: *
type family UnPatDa (pd :: *) :: PKind
-type instance UnPatDa (PatDa w) = w
+data PVar a = PVar (UnivTyRepr a)
+type instance UnPatDa (PVar a) = PKVar a
instance (K3BaseTy a) => Pat (PKVar (a :: *)) where
- data PatDa (PKVar a) = PVar { unPVar :: UnivTyRepr a }
+ type PatDa (PKVar a) = PVar a
type PatTy (PKVar a) = a
type PatBTy (PKVar a) = a
type PatReprFn r (PKVar a) = r a
+data PUnk a = PUnk
+type instance UnPatDa (PUnk a) = PKUnk a
instance (K3BaseTy a) => Pat (PKUnk (a :: *)) where
- data PatDa (PKUnk a) = PUnk
+ type PatDa (PKUnk a) = PUnk a
type PatTy (PKUnk a) = a
type PatBTy (PKUnk a) = ()
type PatReprFn r (PKUnk a) = r ()
+data PJust a = PJust { unPJust :: a }
+type instance UnPatDa (PJust a) = PKJust (UnPatDa a)
instance (Pat w) => Pat (PKJust w) where
- data PatDa (PKJust w) = PJust (PatDa w)
+ type PatDa (PKJust w) = PJust (PatDa w)
type PatTy (PKJust w) = Maybe (PatTy w)
type PatBTy (PKJust w) = PatBTy w
type PatReprFn r (PKJust w) = PatReprFn r w
$(mkTyMapFlat 0 ''MapPatDa ''PatDa)
type family UnMapPatDa (x :: *) :: [PKind]
-$(mkTyUnMap 0 ''UnMapPatDa ''UnPatDa)
+$(mkTyUnMap Nothing 0 ''UnMapPatDa ''UnPatDa)
type family MapPatTy (x :: [PKind]) :: *
$(mkTyMapFlat 0 ''MapPatTy ''PatTy)
type family MapPatReprFn (r :: * -> *) (x :: [PKind]) :: *
$(mkTyMapFlat 1 ''MapPatReprFn ''PatReprFn)
-instance (ts ~ UnMapPatDa (MapPatDa ts))
+$(mkTyUnMap (Just 'PKTup) 0 ''UnPatDa ''UnPatDa)
+
+instance (UnPatDa (MapPatDa ts) ~ 'PKTup ts)
=> Pat (PKTup (ts :: [PKind])) where
- data PatDa (PKTup ts) = PTup (MapPatDa ts)
+ type PatDa (PKTup ts) = MapPatDa ts
type PatTy (PKTup ts) = MapPatTy ts
type PatBTy (PKTup ts) = MapPatBTy ts
type PatReprFn r (PKTup ts) = MapPatReprFn r ts
SKTup :: [SKind] -> SKind
-- | Witness of slice well-formedness
-class Slice r (w :: SKind) where
- data SliceDa w :: *
+class (UnSliceDa (SliceDa w) ~ w) => Slice r (w :: SKind) where
+ type SliceDa w :: *
type SliceTy w :: *
type family UnSliceDa (pd :: *) :: SKind
-type instance UnSliceDa (SliceDa w) = w
+data SVar r a = SVar (r a)
+type instance UnSliceDa (SVar r a) = SKVar r a
instance (K3BaseTy a, r0 ~ r) => Slice r0 (SKVar (r :: * -> *) (a :: *)) where
- data SliceDa (SKVar r a) = SVar (r a)
+ type SliceDa (SKVar r a) = SVar r a
type SliceTy (SKVar r a) = a
+data SUnk a = SUnk
+type instance UnSliceDa (SUnk a) = SKUnk a
instance (K3BaseTy a) => Slice r (SKUnk (a :: *)) where
- data SliceDa (SKUnk a) = SUnk
+ type SliceDa (SKUnk a) = SUnk a
type SliceTy (SKUnk a) = a
+data SJust a = SJust { unSJust :: a }
+type instance UnSliceDa (SJust a) = SKJust (UnSliceDa a)
instance (Slice r s) => Slice r (SKJust s) where
- data SliceDa (SKJust s) = SJust (SliceDa s)
+ type SliceDa (SKJust s) = SJust (SliceDa s)
type SliceTy (SKJust s) = Maybe (SliceTy s)
type family SliceConst (x :: SKind) (r :: * -> *) :: Constraint
$(mkTyMapFlat 0 ''MapSliceDa ''SliceDa)
type family UnMapSliceDa (x :: *) :: [SKind]
-$(mkTyUnMap 0 ''UnMapSliceDa ''UnSliceDa)
+$(mkTyUnMap Nothing 0 ''UnMapSliceDa ''UnSliceDa)
type family MapSliceTy (x :: [SKind]) :: *
$(mkTyMapFlat 0 ''MapSliceTy ''SliceTy)
-instance (ts ~ UnMapSliceDa (MapSliceDa ts), MapSliceConst ts r)
+$(mkTyUnMap (Just 'SKTup) 0 ''UnSliceDa ''UnSliceDa)
+
+instance (UnSliceDa (MapSliceDa ts) ~ 'SKTup ts, MapSliceConst ts r)
=> Slice r (SKTup (ts :: [SKind])) where
- data SliceDa (SKTup ts) = STup (MapSliceDa ts)
+ type SliceDa (SKTup ts) = MapSliceDa ts
type SliceTy (SKTup ts) = MapSliceTy ts
------------------------------------------------------------------------}}}
asColl = const
------------------------------------------------------------------------}}}
-
-- | The composition mkTyMap (MKLT a)
mkTyMapFlat a b c = foreachTupleSize (mkTyMapFlatN a b c)
-mkTyUnMapN :: Int -> Name -> Name -> Int -> Q Dec
-mkTyUnMapN nargs _ty _fn size = do
+mkTyUnMapN :: Maybe Name -> Int -> Name -> Name -> Int -> Q Dec
+mkTyUnMapN _mwr nargs _ty _fn size = do
let ty = conT _ty
let fn = conT _fn
names <- mkNames size
let afn = genMap appT fn id args
tySynInstD _ty (args++[mkTy size names])
+ $ maybe id (\_wr -> appT (conT _wr)) _mwr
$ promoteList $ map (appT afn . varT) names
-mkTyUnMap a b c = foreachTupleSize (mkTyUnMapN a b c)
+mkTyUnMap a b c d = foreachTupleSize (mkTyUnMapN a b c d)
------------------------------------------------------------------------}}}
-- Make Tuple {{{
mkLRecInstance :: (Name, [TypeQ]) -- ^ Class name and args
-> Name
- -> (Name, Name, [ExpQ] -> ExpQ) -- ^ Function, data, and body
+ -> (Name, Maybe Name, [ExpQ] -> ExpQ)
+ -- ^ Function, data, and body
-> Int -- ^ Tuple size
-> Q Dec
-mkLRecInstance (_cname,_cargs) _tyf (_fn,_fpn,fm) n = do
+mkLRecInstance (_cname,_cargs) _tyf (_fn,_mfpn,fm) n = do
names <- mkNames n
let context = cxt $ map (\na -> classP _cname $ _cargs ++ [varT na]) names
let conarg = (appT (conT _tyf) $ promoteList $ map varT names)
let res = noBindS $ appE (varE $ mkName "return") $ fm $ map varE resnames
instanceD context (genMap appT (conT _cname) (id) $ _cargs ++ [conarg])
- [funD _fn [clause [conP _fpn [tupP $ map varP names]]
+ [funD _fn [clause [maybe tupP conP _mfpn $ [tupP $ map varP names]]
(normalB $ doE $ stmts++[res])
[]
]