phase_rs/circuit_syntax/
pattern.rs1use crate::{
4 ket::{CompKetState, KetState},
5 typed_syntax::{PatternT, TermT, TermType},
6};
7
8#[derive(Clone, Debug, PartialEq)]
9pub(crate) struct PatternC {
10 pub(crate) parts: Vec<Option<KetState>>,
11}
12
13fn state_to_pattern(s: Option<KetState>) -> PatternT {
14 s.map_or(
15 PatternT::Unitary(Box::new(TermT::Id(TermType(1)))),
16 |state| PatternT::Ket(CompKetState::single(state)),
17 )
18}
19
20impl PatternC {
21 pub(crate) fn quote(&self) -> PatternT {
22 if self.parts.len() == 1 {
23 state_to_pattern(self.parts[0])
24 } else {
25 PatternT::Tensor(self.parts.iter().cloned().map(state_to_pattern).collect())
26 }
27 }
28
29 pub(crate) fn id_qubits(&self) -> usize {
30 self.parts.iter().filter(|x| x.is_none()).count()
31 }
32
33 pub(crate) fn id(l: usize) -> Self {
34 PatternC {
35 parts: vec![None; l],
36 }
37 }
38}