phase_rs/circuit_syntax/
pattern.rs

1//! Circuit-normal patterns.
2
3use 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}