22module Deriving.DepTyCheck.Gen.ForAllNeededTypes.Impl
33
44import public Control . Monad . State
5- import public Control . Monad . State . Tuple
65
76import public Data . DPair
87import public Data . List . Set
@@ -18,8 +17,8 @@ import public Deriving.DepTyCheck.Gen.ForOneType.Interface
1817
1918ClosuringContext : (Type -> Type ) -> Type
2019ClosuringContext 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
2524nameForGen : 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 =>
104100runCanonic 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