Skip to content

Commit 2c2f9c0

Browse files
committed
Add IntoIterator<Item = &Pk> for Miniscript
1 parent 7bbc3e4 commit 2c2f9c0

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/miniscript/astelem.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,3 +815,45 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
815815
}
816816
}
817817
}
818+
819+
impl<'a, Pk: MiniscriptKey, Ctx: ScriptContext> IntoIterator for &'a Terminal<Pk, Ctx> {
820+
type Item = &'a Pk;
821+
type IntoIter = Box<dyn Iterator<Item = &'a Pk> + 'a>;
822+
823+
fn into_iter(self) -> Self::IntoIter {
824+
use std::iter;
825+
826+
match self {
827+
Terminal::PkK(ref pk) => Box::new(iter::once(pk)),
828+
Terminal::True
829+
| Terminal::False
830+
| Terminal::PkH(_)
831+
| Terminal::After(_)
832+
| Terminal::Older(_)
833+
| Terminal::Sha256(_)
834+
| Terminal::Hash256(_)
835+
| Terminal::Ripemd160(_)
836+
| Terminal::Hash160(_) => Box::new(iter::empty()),
837+
Terminal::Alt(ref i)
838+
| Terminal::Swap(ref i)
839+
| Terminal::Check(ref i)
840+
| Terminal::DupIf(ref i)
841+
| Terminal::Verify(ref i)
842+
| Terminal::NonZero(ref i)
843+
| Terminal::ZeroNotEqual(ref i) => i.into_iter(),
844+
Terminal::AndV(ref i1, ref i2)
845+
| Terminal::AndB(ref i1, ref i2)
846+
| Terminal::OrB(ref i1, ref i2)
847+
| Terminal::OrD(ref i1, ref i2)
848+
| Terminal::OrC(ref i1, ref i2)
849+
| Terminal::OrI(ref i1, ref i2) => Box::new(i1.into_iter().chain(i2.into_iter())),
850+
Terminal::AndOr(ref i1, ref i2, ref i3) => {
851+
Box::new(i1.into_iter().chain(i2.into_iter()).chain(i3.into_iter()))
852+
}
853+
Terminal::Thresh(_, ref scripts) => {
854+
Box::new(scripts.iter().map(|s| s.into_iter()).flatten())
855+
}
856+
Terminal::Multi(_, ref pks) => Box::new(pks.iter()),
857+
}
858+
}
859+
}

src/miniscript/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,15 @@ where
413413
}
414414
}
415415

416+
impl<'a, Pk: MiniscriptKey, Ctx: ScriptContext> IntoIterator for &'a Miniscript<Pk, Ctx> {
417+
type Item = &'a Pk;
418+
type IntoIter = Box<dyn Iterator<Item = &'a Pk> + 'a>;
419+
420+
fn into_iter(self) -> Self::IntoIter {
421+
self.node.into_iter()
422+
}
423+
}
424+
416425
serde_string_impl_pk!(Miniscript, "a miniscript", Ctx; ScriptContext);
417426

418427
#[cfg(test)]

0 commit comments

Comments
 (0)