@@ -7,10 +7,9 @@ use miniscript::iter::{Tree, TreeLike};
7
7
8
8
use crate :: array:: BTreeSlice ;
9
9
use crate :: error:: Error ;
10
- use crate :: named:: { PairBuilder , SelectorBuilder } ;
10
+ use crate :: named:: { CoreExt , PairBuilder , SelectorBuilder } ;
11
11
use crate :: str:: Identifier ;
12
12
use crate :: types:: { ResolvedType , TypeInner } ;
13
- use crate :: ProgNode ;
14
13
15
14
/// Pattern for binding values to variables.
16
15
#[ derive( Debug , Clone , Eq , PartialEq , Hash ) ]
@@ -195,14 +194,15 @@ impl BasePattern {
195
194
196
195
/// Check if the `identifier` is contained inside the pattern.
197
196
pub fn contains ( & self , identifier : & Identifier ) -> bool {
198
- self . get ( identifier) . is_some ( )
197
+ self . pre_order_iter ( )
198
+ . any ( |node| matches ! ( node, BasePattern :: Identifier ( id) if id == identifier) )
199
199
}
200
200
201
201
/// Compute a Simplicity expression that returns the value of the given `identifier`.
202
202
/// The expression takes as input a value that matches the `self` pattern.
203
203
///
204
204
/// The expression is a sequence of `take` and `drop` followed by `iden`.
205
- fn get ( & self , identifier : & Identifier ) -> Option < SelectorBuilder < ProgNode > > {
205
+ fn get < P : CoreExt > ( & self , identifier : & Identifier ) -> Option < SelectorBuilder < P > > {
206
206
let mut selector = SelectorBuilder :: default ( ) ;
207
207
208
208
for data in self . verbose_pre_order_iter ( ) {
@@ -302,11 +302,11 @@ impl BasePattern {
302
302
/// This means there are infinitely many translating expressions from `self` to `to`.
303
303
/// For instance, `iden`, `iden & iden`, `(iden & iden) & iden`, and so on.
304
304
/// We enforce a unique translation by banning ignore from the `to` pattern.
305
- pub fn translate (
305
+ pub fn translate < P : CoreExt > (
306
306
& self ,
307
307
ctx : & simplicity:: types:: Context ,
308
308
to : & Self ,
309
- ) -> Option < PairBuilder < ProgNode > > {
309
+ ) -> Option < PairBuilder < P > > {
310
310
#[ derive( Debug , Clone ) ]
311
311
enum Task < ' a > {
312
312
Translate ( & ' a BasePattern , & ' a BasePattern ) ,
@@ -439,6 +439,8 @@ impl From<&Pattern> for BasePattern {
439
439
#[ cfg( test) ]
440
440
mod tests {
441
441
use super :: * ;
442
+ use crate :: named;
443
+ use simplicity:: jet:: Elements ;
442
444
443
445
#[ test]
444
446
fn translate_pattern ( ) {
@@ -462,7 +464,9 @@ mod tests {
462
464
463
465
for ( target, expected_expr) in target_expr {
464
466
let ctx = simplicity:: types:: Context :: new ( ) ;
465
- let expr = env. translate ( & ctx, & target) . unwrap ( ) ;
467
+ let expr = env
468
+ . translate :: < Arc < named:: ConstructNode < Elements > > > ( & ctx, & target)
469
+ . unwrap ( ) ;
466
470
assert_eq ! ( expected_expr, expr. as_ref( ) . display_expr( ) . to_string( ) ) ;
467
471
}
468
472
}
0 commit comments