Skip to content

Commit d1aca8c

Browse files
committed
[ derive ] Return types with weighting functions, don't store them
1 parent 3dd917b commit d1aca8c

1 file changed

Lines changed: 14 additions & 16 deletions

File tree

  • src/Deriving/DepTyCheck/Gen/ForAllNeededTypes

src/Deriving/DepTyCheck/Gen/ForAllNeededTypes/Impl.idr

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ ClosuringContext : (Type -> Type) -> Type
2020
ClosuringContext 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

2625
nameForGen : GenSignature -> Name
@@ -36,28 +35,27 @@ lookupLengthChecked intSig m = lookup intSig m >>= \(extSig, name) => (name,) <$
3635
No _ => Nothing
3736

3837
deriveAll : 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

6260
DeriveBodyForType => 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)
106104
runCanonic 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

Comments
 (0)