// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
use crate::display::join;
use std::{
fmt::{self, Display, Formatter},
iter,
};
/// A functor application.
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct FunctorApp {
/// An invocation is either adjoint or not, with each successive use of `Adjoint` functor switching
/// between the two, so a bool is sufficient to track.
pub adjoint: bool,
/// An invocation can have multiple `Controlled` functors with each one adding another layer of updates
/// to the argument tuple, so the functor application must be tracked with a count.
pub controlled: u8,
}
impl Display for FunctorApp {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let controlleds = std::iter::repeat_n("Controlled", self.controlled.into());
let adjoint = iter::once("Adjoint").filter(|_| self.adjoint);
join(f, controlleds.chain(adjoint), " ")
}
}microsoft/qdk
Publicmirrored from https://github.com/microsoft/qdkAvailable
source/compiler/qsc_data_structures/src/functors.rs
28lines · modepreview