@@ -96,15 +96,20 @@ elabRecord info syn fc tyn ty cn cty
9696 cimp <- case lookupCtxt Nothing cn (idris_implicits i) of
9797 [imps] -> return imps
9898 let ptys = getProjs [] (renameBs cimp cty)
99+ let ptys_u = getProjs [] cty
99100 let recty = getRecTy cty
100101 logLvl 6 $ show (recty, ptys)
101102 let substs = map (\ (n, _) -> (n, PApp fc (PRef fc n)
102103 [pexp (PRef fc rec)])) ptys
103− let ptpos = zip ptys [0..]
104− decls <- mapM (mkProj recty substs cimp) ptpos
105− mapM_ (elabDecl info) (concat decls)
104+ proj_decls <- mapM (mkProj recty substs cimp) (zip ptys [0..])
105+ let nonImp = mapMaybe isNonImp (zip cimp ptys_u)
106+ update_decls <- mapM (mkUpdate recty (length nonImp)) (zip nonImp [0..])
107+ mapM_ (elabDecl info) (concat (proj_decls ++ update_decls))
106108 where
107109
110+ isNonImp (PExp _ _ _, a) = Just a
111+ isNonImp _ = Nothing
112+
108113 renameBs (PImp _ _ _ _ : ps) (PPi p n ty s)
109114 = PPi p (mkImp n) ty (renameBs ps (substMatch n (PRef fc (mkImp n)) s))
110115 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
126131 mkImp (MN 0 n) = MN 0 ("implicit_" ++ n)
127132 mkImp (NS n s) = NS (mkImp n) s
128133
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
137+
129138 mkProj recty substs cimp ((pn, pty), pos)
130139 = do let pfnTy = PTy defaultSyntax fc [] pn
131140 (PPi expl rec recty
@@ -143,6 +152,26 @@ elabRecord info syn fc tyn ty cn cty
143152
144153 implicitise (pa, t) = pa { getTm = t }
145154
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
159+ (PPi expl pn pty
160+ (PPi expl rec recty recty))
161+ let pls = map (\x -> PRef fc (MN x "field")) [0..num-1]
162+ let lhsArgs = pls
163+ let rhsArgs = take pos pls ++ (PRef fc valname) :
164+ drop (pos + 1) pls
165+ let before = pos
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))])
170+ []
171+ (PApp fc (PRef fc cn)
172+ (map pexp rhsArgs)) []
173+ return [pfnTy, PClauses fc [] setname [pclause]]
174+
146175elabCon :: ElabInfo -> SyntaxInfo -> Name -> (Name, PTerm, FC) -> Idris (Name, Type)
147176elabCon info syn tn (n, t_in, fc)
148177 = do checkUndefined fc n