@@ -194,19 +194,6 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
194
194
}
195
195
}
196
196
197
- /// Compile [`Policy::Or`] and [`Policy::Threshold`] according to odds
198
- #[ cfg( feature = "compiler" ) ]
199
- fn compile_tr_policy ( & self ) -> Result < TapTree < Pk > , Error > {
200
- let leaf_compilations: Vec < _ > = self
201
- . to_tapleaf_prob_vec ( 1.0 )
202
- . into_iter ( )
203
- . filter ( |x| x. 1 != Policy :: Unsatisfiable )
204
- . map ( |( prob, ref policy) | ( OrdF64 ( prob) , compiler:: best_compilation ( policy) . unwrap ( ) ) )
205
- . collect ( ) ;
206
- let taptree = with_huffman_tree :: < Pk > ( leaf_compilations) . unwrap ( ) ;
207
- Ok ( taptree)
208
- }
209
-
210
197
/// Extract the internal_key from policy tree.
211
198
#[ cfg( feature = "compiler" ) ]
212
199
fn extract_key ( self , unspendable_key : Option < Pk > ) -> Result < ( Pk , Policy < Pk > ) , Error > {
@@ -276,7 +263,21 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
276
263
internal_key,
277
264
match policy {
278
265
Policy :: Trivial => None ,
279
- policy => Some ( policy. compile_tr_policy ( ) ?) ,
266
+ policy => {
267
+ let vec_policies: Vec < _ > = policy. to_tapleaf_prob_vec ( 1.0 ) ;
268
+ let mut leaf_compilations: Vec < ( OrdF64 , Miniscript < Pk , Tap > ) > = vec ! [ ] ;
269
+ for ( prob, pol) in vec_policies {
270
+ // policy corresponding to the key (replaced by unsatisfiable) is skipped
271
+ if pol == Policy :: Unsatisfiable {
272
+ continue ;
273
+ }
274
+ let compilation = compiler:: best_compilation :: < Pk , Tap > ( & pol) ?;
275
+ compilation. sanity_check ( ) ?;
276
+ leaf_compilations. push ( ( OrdF64 ( prob) , compilation) ) ;
277
+ }
278
+ let taptree = with_huffman_tree :: < Pk > ( leaf_compilations) ?;
279
+ Some ( taptree)
280
+ }
280
281
} ,
281
282
) ?;
282
283
Ok ( tree)
0 commit comments