@@ -20,7 +20,6 @@ ClosuringContext : (Type -> Type) -> Type
2020ClosuringContext m =
2121 ( MonadState (ListSet GenSignature ) m -- gens already asked to be derived
2222 , MonadState (List GenSignature , List GenSignature ) m -- two queues of gens to be derived, one for known types, one the unknown ones
23- , MonadState (ListSet TypeInfo ) m -- type names that were asked for deriving their weighting function
2423 )
2524
2625nameForGen : GenSignature -> Name
@@ -36,28 +35,27 @@ lookupLengthChecked intSig m = lookup intSig m >>= \(extSig, name) => (name,) <$
3635 No _ => Nothing
3736
3837deriveAll : NamesInfoInTypes => ConsRecs => DeriveBodyForType => DerivationClosure m => ClosuringContext m => Elaboration m =>
39- List (Decl, Decl) -> m $ List (Decl, Decl)
40- deriveAll acc = do
38+ ListSet TypeInfo -> List (Decl, Decl) -> m (ListSet TypeInfo, List (Decl, Decl) )
39+ deriveAll weightFunTys decls = do
4140 (toDeriveKnown, toDeriveUnknown) <- get {stateType= (List _ , List _ )}
4241 put ([], toDeriveUnknown)
43- derived <- ( ++ acc) <$> for toDeriveKnown deriveOne
42+ (weightFunTys, decls) <- bimap ( foldl insert' weightFunTys . join) (decls ++ ) . unzip <$> for toDeriveKnown deriveOne
4443 if not $ null toDeriveKnown
45- then assert_total deriveAll derived
44+ then assert_total deriveAll weightFunTys decls
4645 else if null toDeriveUnknown
47- then pure derived
46+ then pure (weightFunTys, decls)
4847 else do
4948 (niit, cr) <- updateNamesAndConsRecs $ targetType <$> toDeriveUnknown
5049 put (toDeriveUnknown, [])
51- assert_total $ deriveAll @{niit} @{cr} derived
50+ assert_total $ deriveAll @{niit} @{cr} weightFunTys decls
5251 where
53- deriveOne : GenSignature -> m (Decl, Decl)
52+ deriveOne : GenSignature -> m (List TypeInfo, Decl, Decl)
5453 deriveOne sig = do
5554 let name = nameForGen sig
5655 -- derive declaration and body for the asked signature. It's important to call it AFTER update of the map in the state to not to cycle
5756 let genFunClaim = export' name $ canonicSig sig
5857 (tyWithWeightFuns, genFunBody) <- logBounds Info " deptycheck.derive.type" [sig] $ canonicBody sig name
59- modify $ \ old => foldl List . Set . insert' old tyWithWeightFuns
60- pure (genFunClaim, def name genFunBody)
58+ pure (tyWithWeightFuns, genFunClaim, def name genFunBody)
6159
6260DeriveBodyForType => ClosuringContext m => Elaboration m => SortedMap GenSignature (ExternalGenSignature , Name ) => DerivationClosure m where
6361
@@ -70,10 +68,10 @@ DeriveBodyForType => ClosuringContext m => Elaboration m => SortedMap GenSignatu
7068 (callExternalGen extSig name (var outmostFuelArg) $ rewrite lenEq in values, Just (_ ** extSig. gendOrder))
7169
7270 -- put to derivation queue if necessary
73- when (not ! (gets $ contains sig)) $ do
71+ when (not ! (gets $ List . Set . contains sig)) $ do
7472
7573 -- remember that we're responsible for this signature derivation
76- modify $ insert sig
74+ modify $ List . Set . insert sig
7775
7876 -- remember the task to derive
7977 modify {stateType= (List _ , List _ )} $ if isTypeKnown sig. targetType then mapFst $ (:: ) sig else mapSnd $ (:: ) sig
@@ -105,10 +103,10 @@ runCanonic : DeriveBodyForType => NamesInfoInTypes => ConsRecs =>
105103 SortedMap ExternalGenSignature Name -> (forall m. DerivationClosure m => m a) -> Elab (a, List Decl)
106104runCanonic exts calc = do
107105 let exts = SortedMap . fromList $ exts. asList <&> \ namedSig => (fst $ internalise $ fst namedSig, namedSig)
108- (( _ , _ , weightingFuns), (x, derived)) <- runStateT
109- (empty, ( empty, empty), empty @{ TypeInfoEqByName } )
110- [| (calc, deriveAll []) | ]
111- {stateType= (ListSet GenSignature , (List GenSignature , List GenSignature ), ListSet TypeInfo )}
106+ (x, weightingFuns, derived) <- evalStateT
107+ (empty, empty, empty)
108+ [| (calc, deriveAll (empty @{ TypeInfoEqByName }) []) | ]
109+ {stateType= (ListSet GenSignature , (List GenSignature , List GenSignature ))}
112110 {m= Elab }
113111 let derived = sortBy (compare `on` declName . fst ) $ derived ++ mapMaybe deriveWeightingFun (Prelude . toList weightingFuns)
114112 let (defs, bodies) = unzip derived
0 commit comments