@@ -96,15 +96,20 @@ elabRecord info syn fc tyn ty cn cty
96 cimp <- case lookupCtxt Nothing cn (idris_implicits i) of
96 cimp <- case lookupCtxt Nothing cn (idris_implicits i) of
97 [imps] -> return imps
97 [imps] -> return imps
98 let ptys = getProjs [] (renameBs cimp cty)
98 let ptys = getProjs [] (renameBs cimp cty)
99+ let ptys_u = getProjs [] cty
99 let recty = getRecTy cty
100 let recty = getRecTy cty
100 logLvl 6 $ show (recty, ptys)
101 logLvl 6 $ show (recty, ptys)
101 let substs = map (\ (n, _) -> (n, PApp fc (PRef fc n)
102 let substs = map (\ (n, _) -> (n, PApp fc (PRef fc n)
102 [pexp (PRef fc rec)])) ptys
103 [pexp (PRef fc rec)])) ptys
103− let ptpos = zip ptys [0..]
104+ proj_decls <- mapM (mkProj recty substs cimp) (zip ptys [0..])
104− decls <- mapM (mkProj recty substs cimp) ptpos
105+ let nonImp = mapMaybe isNonImp (zip cimp ptys_u)
106+ update_decls <- mapM (mkUpdate recty (length nonImp)) (zip nonImp [0..])
105− mapM_ (elabDecl info) (concat decls)
107+ mapM_ (elabDecl info) (concat (proj_decls ++ update_decls))
110+ isNonImp (PExp _ _ _, a) = Just a
111+ isNonImp _ = Nothing
108 renameBs (PImp _ _ _ _ : ps) (PPi p n ty s)
113 renameBs (PImp _ _ _ _ : ps) (PPi p n ty s)
109 = PPi p (mkImp n) ty (renameBs ps (substMatch n (PRef fc (mkImp n)) s))
114 = PPi p (mkImp n) ty (renameBs ps (substMatch n (PRef fc (mkImp n)) s))
110 renameBs (_:ps) (PPi p n ty s) = PPi p n ty (renameBs ps s)
115 renameBs (_:ps) (PPi p n ty s) = PPi p n ty (renameBs ps s)
@@ -126,6 +131,10 @@ elabRecord info syn fc tyn ty cn cty
126 mkImp (MN 0 n) = MN 0 ("implicit_" ++ n)
131 mkImp (MN 0 n) = MN 0 ("implicit_" ++ n)
127 mkImp (NS n s) = NS (mkImp n) s
132 mkImp (NS n s) = NS (mkImp n) s
134+ mkSet (UN n) = UN ("set_" ++ n)
135+ mkSet (MN 0 n) = MN 0 ("set_" ++ n)
136+ mkSet (NS n s) = NS (mkImp n) s
129 mkProj recty substs cimp ((pn, pty), pos)
138 mkProj recty substs cimp ((pn, pty), pos)
130 = do let pfnTy = PTy defaultSyntax fc [] pn
139 = do let pfnTy = PTy defaultSyntax fc [] pn
131 (PPi expl rec recty
140 (PPi expl rec recty
@@ -143,6 +152,26 @@ elabRecord info syn fc tyn ty cn cty
144 implicitise (pa, t) = pa { getTm = t }
153 implicitise (pa, t) = pa { getTm = t }
155+ mkUpdate recty num ((pn, pty), pos)
156+ = do let setname = mkSet pn
157+ let valname = MN 0 "updateval"
158+ let pfnTy = PTy defaultSyntax fc [] setname
160+ (PPi expl rec recty recty))
161+ let pls = map (\x -> PRef fc (MN x "field")) [0..num-1]
163+ let rhsArgs = take pos pls ++ (PRef fc valname) :
166+ let pclause = PClause setname (PApp fc (PRef fc setname)
167+ [pexp (PRef fc valname),
168+ pexp (PApp fc (PRef fc cn)
169+ (map pexp lhsArgs))])
171+ (PApp fc (PRef fc cn)
172+ (map pexp rhsArgs)) []
173+ return [pfnTy, PClauses fc [] setname [pclause]]
146elabCon :: ElabInfo -> SyntaxInfo -> Name -> (Name, PTerm, FC) -> Idris (Name, Type)
175elabCon :: ElabInfo -> SyntaxInfo -> Name -> (Name, PTerm, FC) -> Idris (Name, Type)
147elabCon info syn tn (n, t_in, fc)
176elabCon info syn tn (n, t_in, fc)
148 = do checkUndefined fc n
177 = do checkUndefined fc n