Skip to content

Commit b29f7b6

Browse files
committed
[ derive ] Remove all derived generators set from the monadic state
1 parent d1aca8c commit b29f7b6

1 file changed

Lines changed: 15 additions & 19 deletions

File tree

  • src/Deriving/DepTyCheck/Gen/ForAllNeededTypes

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

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
module Deriving.DepTyCheck.Gen.ForAllNeededTypes.Impl
33

44
import public Control.Monad.State
5-
import public Control.Monad.State.Tuple
65

76
import public Data.DPair
87
import public Data.List.Set
@@ -18,8 +17,8 @@ import public Deriving.DepTyCheck.Gen.ForOneType.Interface
1817

1918
ClosuringContext : (Type -> Type) -> Type
2019
ClosuringContext m =
21-
( MonadState (ListSet GenSignature) m -- gens already asked to be derived
22-
, MonadState (List GenSignature, List GenSignature) m -- two queues of gens to be derived, one for known types, one the unknown ones
20+
( ListSet GenSignature -- gens already asked to be derived
21+
, MonadState (ListSet GenSignature, ListSet GenSignature) m -- two queues of gens to be derived, one for known types, one the unknown ones
2322
)
2423

2524
nameForGen : GenSignature -> Name
@@ -34,20 +33,20 @@ lookupLengthChecked intSig m = lookup intSig m >>= \(extSig, name) => (name,) <$
3433
Yes prf => Just $ Element extSig prf
3534
No _ => Nothing
3635

37-
deriveAll : NamesInfoInTypes => ConsRecs => DeriveBodyForType => DerivationClosure m => ClosuringContext m => Elaboration m =>
36+
deriveAll : NamesInfoInTypes => ConsRecs => (cc : ClosuringContext m) => DeriveBodyForType => DerivationClosure m => Elaboration m =>
3837
ListSet TypeInfo -> List (Decl, Decl) -> m (ListSet TypeInfo, List (Decl, Decl))
39-
deriveAll weightFunTys decls = do
40-
(toDeriveKnown, toDeriveUnknown) <- get {stateType=(List _, List _)}
41-
put ([], toDeriveUnknown)
42-
(weightFunTys, decls) <- bimap (foldl insert' weightFunTys . join) (decls ++) . unzip <$> for toDeriveKnown deriveOne
38+
deriveAll weightFunTys decls {cc=(alreadyDerived, _)}= do
39+
(toDeriveKnown, toDeriveUnknown) <- mapHom ((`difference` alreadyDerived) . normalise) <$> get {stateType=(ListSet _, ListSet _)}
40+
put (empty, toDeriveUnknown)
41+
(weightFunTys, decls) <- bimap (foldl insert' weightFunTys . join) (decls ++) . unzip <$> for (toList toDeriveKnown) deriveOne
4342
if not $ null toDeriveKnown
44-
then assert_total deriveAll weightFunTys decls
43+
then assert_total $ deriveAll {cc=(alreadyDerived `union` toDeriveKnown, %search)} weightFunTys decls
4544
else if null toDeriveUnknown
4645
then pure (weightFunTys, decls)
4746
else do
48-
(niit, cr) <- updateNamesAndConsRecs $ targetType <$> toDeriveUnknown
49-
put (toDeriveUnknown, [])
50-
assert_total $ deriveAll @{niit} @{cr} weightFunTys decls
47+
(niit, cr) <- updateNamesAndConsRecs $ targetType <$> toList toDeriveUnknown
48+
put (toDeriveUnknown, empty)
49+
assert_total $ deriveAll @{niit} @{cr} {cc=(alreadyDerived `union` toDeriveUnknown, %search)} weightFunTys decls
5150
where
5251
deriveOne : GenSignature -> m (List TypeInfo, Decl, Decl)
5352
deriveOne sig = do
@@ -68,13 +67,10 @@ DeriveBodyForType => ClosuringContext m => Elaboration m => SortedMap GenSignatu
6867
(callExternalGen extSig name (var outmostFuelArg) $ rewrite lenEq in values, Just (_ ** extSig.gendOrder))
6968

7069
-- put to derivation queue if necessary
71-
when (not !(gets $ List.Set.contains sig)) $ do
72-
73-
-- remember that we're responsible for this signature derivation
74-
modify $ List.Set.insert sig
70+
when (not $ List.Set.contains sig %search) $ do
7571

7672
-- remember the task to derive
77-
modify {stateType=(List _, List _)} $ if isTypeKnown sig.targetType then mapFst $ (::) sig else mapSnd $ (::) sig
73+
modify $ if isTypeKnown sig.targetType then mapFst $ List.Set.insert sig else mapSnd $ List.Set.insert sig
7874

7975
-- call the internal gen
8076
logValue DetailedDebug "deptycheck.derive.closuring.internal" [sig] "is used as an internal generator"
@@ -104,9 +100,9 @@ runCanonic : DeriveBodyForType => NamesInfoInTypes => ConsRecs =>
104100
runCanonic exts calc = do
105101
let exts = SortedMap.fromList $ exts.asList <&> \namedSig => (fst $ internalise $ fst namedSig, namedSig)
106102
(x, weightingFuns, derived) <- evalStateT
107-
(empty, empty, empty)
103+
(empty, empty)
108104
[| (calc, deriveAll (empty @{TypeInfoEqByName}) []) |]
109-
{stateType=(ListSet GenSignature, (List GenSignature, List GenSignature))}
105+
{stateType=(ListSet GenSignature, ListSet GenSignature)}
110106
{m=Elab}
111107
let derived = sortBy (compare `on` declName . fst) $ derived ++ mapMaybe deriveWeightingFun (Prelude.toList weightingFuns)
112108
let (defs, bodies) = unzip derived

0 commit comments

Comments
 (0)