diff --git a/src/builder/build_traits.rs b/src/builder/build_traits.rs index 0ffc6eb3e..1f6d045f2 100644 --- a/src/builder/build_traits.rs +++ b/src/builder/build_traits.rs @@ -17,7 +17,7 @@ use crate::{ types::EdgeKind, }; -use crate::extension::{prelude_registry, ExtensionRegistry, ExtensionSet}; +use crate::extension::{ExtensionRegistry, ExtensionSet, PRELUDE_REGISTRY}; use crate::types::{FunctionType, Signature, Type, TypeRow}; use itertools::Itertools; @@ -138,7 +138,7 @@ pub trait HugrBuilder: Container { where Self: Sized, { - self.finish_hugr(&prelude_registry()) + self.finish_hugr(&PRELUDE_REGISTRY) } } @@ -739,7 +739,7 @@ pub trait DataflowHugr: HugrBuilder + Dataflow { where Self: Sized, { - self.finish_hugr_with_outputs(outputs, &prelude_registry()) + self.finish_hugr_with_outputs(outputs, &PRELUDE_REGISTRY) } } diff --git a/src/extension.rs b/src/extension.rs index 4f89b1e41..c80181933 100644 --- a/src/extension.rs +++ b/src/extension.rs @@ -27,7 +27,7 @@ pub use type_def::{TypeDef, TypeDefBound}; pub mod prelude; pub mod validate; -pub use prelude::{prelude_registry, PRELUDE}; +pub use prelude::{PRELUDE, PRELUDE_REGISTRY}; /// Extension Registries store extensions to be looked up e.g. during validation. pub struct ExtensionRegistry(BTreeMap); @@ -39,7 +39,7 @@ impl ExtensionRegistry { } /// Gets the Extension with the given name - pub fn get(&self, name: &SmolStr) -> Option<&Extension> { + pub fn get(&self, name: &str) -> Option<&Extension> { self.0.get(name) } } diff --git a/src/extension/prelude.rs b/src/extension/prelude.rs index 04264e781..dcd2bede7 100644 --- a/src/extension/prelude.rs +++ b/src/extension/prelude.rs @@ -15,10 +15,11 @@ use crate::{ use super::ExtensionRegistry; +/// Name of prelude extension. +pub const PRELUDE_ID: &str = "prelude"; lazy_static! { - /// Prelude extension - pub static ref PRELUDE: Extension = { - let mut prelude = Extension::new(SmolStr::new_inline("prelude")); + static ref PRELUDE_DEF: Extension = { + let mut prelude = Extension::new(SmolStr::new_inline(PRELUDE_ID)); prelude .add_type( SmolStr::new_inline("usize"), @@ -48,22 +49,23 @@ lazy_static! { .unwrap(); prelude }; -} + /// An extension registry containing only the prelude + pub static ref PRELUDE_REGISTRY: ExtensionRegistry = [PRELUDE_DEF.to_owned()].into(); + + /// Prelude extension + pub static ref PRELUDE: &'static Extension = PRELUDE_REGISTRY.get(PRELUDE_ID).unwrap(); -/// An extension registry containing only the prelude -pub fn prelude_registry() -> ExtensionRegistry { - [PRELUDE.to_owned()].into() } pub(crate) const USIZE_CUSTOM_T: CustomType = CustomType::new_simple( SmolStr::new_inline("usize"), - SmolStr::new_inline("prelude"), + SmolStr::new_inline(PRELUDE_ID), TypeBound::Eq, ); pub(crate) const QB_CUSTOM_T: CustomType = CustomType::new_simple( SmolStr::new_inline("qubit"), - SmolStr::new_inline("prelude"), + SmolStr::new_inline(PRELUDE_ID), TypeBound::Any, ); @@ -85,7 +87,7 @@ pub fn new_array(typ: Type, size: u64) -> Type { pub(crate) const ERROR_TYPE: Type = Type::new_extension(CustomType::new_simple( smol_str::SmolStr::new_inline("error"), - smol_str::SmolStr::new_inline("prelude"), + smol_str::SmolStr::new_inline(PRELUDE_ID), TypeBound::Eq, )); diff --git a/src/hugr/hugrmut.rs b/src/hugr/hugrmut.rs index a7e9e3af1..5cd338f35 100644 --- a/src/hugr/hugrmut.rs +++ b/src/hugr/hugrmut.rs @@ -474,7 +474,7 @@ pub(crate) mod sealed { mod test { use crate::{ extension::prelude::USIZE_T, - extension::prelude_registry, + extension::PRELUDE_REGISTRY, hugr::HugrView, macros::type_row, ops::{self, dataflow::IOTrait, LeafOp}, @@ -523,6 +523,6 @@ mod test { } // Finish the construction and create the HUGR - builder.validate(&prelude_registry()).unwrap(); + builder.validate(&PRELUDE_REGISTRY).unwrap(); } } diff --git a/src/hugr/rewrite/insert_identity.rs b/src/hugr/rewrite/insert_identity.rs index a12dd045b..bd3aae7c2 100644 --- a/src/hugr/rewrite/insert_identity.rs +++ b/src/hugr/rewrite/insert_identity.rs @@ -107,7 +107,7 @@ mod tests { use super::*; use crate::{ algorithm::nest_cfgs::test::build_conditional_in_loop_cfg, - extension::{prelude::QB_T, prelude_registry}, + extension::{prelude::QB_T, PRELUDE_REGISTRY}, ops::handle::NodeHandle, Hugr, }; @@ -135,7 +135,7 @@ mod tests { assert_eq!(noop, LeafOp::Noop { ty: QB_T }); - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); } #[test] diff --git a/src/hugr/rewrite/outline_cfg.rs b/src/hugr/rewrite/outline_cfg.rs index 972b5bd1b..eb9ef180c 100644 --- a/src/hugr/rewrite/outline_cfg.rs +++ b/src/hugr/rewrite/outline_cfg.rs @@ -5,7 +5,7 @@ use itertools::Itertools; use thiserror::Error; use crate::builder::{BlockBuilder, Container, Dataflow, SubContainer}; -use crate::extension::prelude_registry; +use crate::extension::PRELUDE_REGISTRY; use crate::hugr::hugrmut::sealed::HugrMutInternals; use crate::hugr::rewrite::Rewrite; use crate::hugr::{HugrMut, HugrView}; @@ -118,7 +118,7 @@ impl Rewrite for OutlineCfg { .unwrap(); let pred_wire = new_block_bldr.load_const(&predicate).unwrap(); let new_block_hugr = new_block_bldr - .finish_hugr_with_outputs(pred_wire, cfg_outputs, &prelude_registry()) + .finish_hugr_with_outputs(pred_wire, cfg_outputs, &PRELUDE_REGISTRY) .unwrap(); h.insert_hugr(outer_cfg, new_block_hugr).unwrap() }; @@ -211,7 +211,7 @@ mod test { use crate::algorithm::nest_cfgs::test::{ build_cond_then_loop_cfg, build_conditional_in_loop_cfg, }; - use crate::extension::prelude_registry; + use crate::extension::PRELUDE_REGISTRY; use crate::ops::handle::NodeHandle; use crate::{HugrView, Node}; use cool_asserts::assert_matches; @@ -237,7 +237,7 @@ mod test { // \---<---<---<---<---<--<---/ // merge is unique predecessor of tail let merge = h.input_neighbours(tail).exactly_one().unwrap(); - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); let backup = h.clone(); let r = h.apply_rewrite(OutlineCfg::new([merge, tail])); assert_matches!(r, Err(OutlineCfgError::MultipleExitEdges(_, _))); @@ -270,10 +270,10 @@ mod test { for n in [head, tail, merge] { assert_eq!(depth(&h, n), 1); } - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); let blocks = [head, left, right, merge]; h.apply_rewrite(OutlineCfg::new(blocks)).unwrap(); - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); for n in blocks { assert_eq!(depth(&h, n), 3); } @@ -300,7 +300,7 @@ mod test { let (merge, tail) = (merge.node(), tail.node()); let head = h.output_neighbours(merge).exactly_one().unwrap(); - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); let blocks_to_move = [entry, left, right, merge]; let other_blocks = [head, tail, exit]; for &n in blocks_to_move.iter().chain(other_blocks.iter()) { @@ -308,7 +308,7 @@ mod test { } h.apply_rewrite(OutlineCfg::new(blocks_to_move.iter().copied())) .unwrap(); - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); let new_entry = h.children(h.root()).next().unwrap(); for n in other_blocks { assert_eq!(depth(&h, n), 1); diff --git a/src/hugr/rewrite/simple_replace.rs b/src/hugr/rewrite/simple_replace.rs index d0a3c34bf..863003afa 100644 --- a/src/hugr/rewrite/simple_replace.rs +++ b/src/hugr/rewrite/simple_replace.rs @@ -201,7 +201,7 @@ pub(in crate::hugr::rewrite) mod test { HugrBuilder, ModuleBuilder, }; use crate::extension::prelude::BOOL_T; - use crate::extension::{prelude_registry, EMPTY_REG}; + use crate::extension::{EMPTY_REG, PRELUDE_REGISTRY}; use crate::hugr::views::HugrView; use crate::hugr::{Hugr, Node}; use crate::ops::OpTag; @@ -388,7 +388,7 @@ pub(in crate::hugr::rewrite) mod test { // ├───┤├───┤┌─┴─┐ // ┤ H ├┤ H ├┤ X ├ // └───┘└───┘└───┘ - assert_eq!(h.validate(&prelude_registry()), Ok(())); + assert_eq!(h.validate(&PRELUDE_REGISTRY), Ok(())); } #[rstest] @@ -466,7 +466,7 @@ pub(in crate::hugr::rewrite) mod test { // ├───┤├───┤┌───┐ // ┤ H ├┤ H ├┤ H ├ // └───┘└───┘└───┘ - assert_eq!(h.validate(&prelude_registry()), Ok(())); + assert_eq!(h.validate(&PRELUDE_REGISTRY), Ok(())); } #[test] diff --git a/src/hugr/serialize.rs b/src/hugr/serialize.rs index 4b3b0f752..5584e42a2 100644 --- a/src/hugr/serialize.rs +++ b/src/hugr/serialize.rs @@ -267,7 +267,7 @@ impl TryFrom for Hugr { pub mod test { use super::*; - use crate::extension::{prelude_registry, EMPTY_REG}; + use crate::extension::{EMPTY_REG, PRELUDE_REGISTRY}; use crate::hugr::hugrmut::sealed::HugrMutInternals; use crate::{ builder::{ @@ -466,12 +466,12 @@ pub mod test { hugr.connect(new_in, 0, out, 0).unwrap(); hugr.move_before_sibling(new_in, old_in).unwrap(); hugr.remove_node(old_in).unwrap(); - hugr.validate(&prelude_registry()).unwrap(); + hugr.validate(&PRELUDE_REGISTRY).unwrap(); let ser = serde_json::to_vec(&hugr).unwrap(); let new_hugr: Hugr = serde_json::from_slice(&ser).unwrap(); new_hugr.validate(&EMPTY_REG).unwrap_err(); - new_hugr.validate(&prelude_registry()).unwrap(); + new_hugr.validate(&PRELUDE_REGISTRY).unwrap(); // Check the canonicalization works let mut h_canon = hugr.clone(); diff --git a/src/hugr/validate.rs b/src/hugr/validate.rs index a4338c380..83b087ff3 100644 --- a/src/hugr/validate.rs +++ b/src/hugr/validate.rs @@ -697,7 +697,7 @@ mod test { use super::*; use crate::builder::{BuildError, Container, Dataflow, DataflowSubContainer, ModuleBuilder}; use crate::extension::prelude::{BOOL_T, PRELUDE, USIZE_T}; - use crate::extension::{prelude_registry, Extension, ExtensionSet, TypeDefBound, EMPTY_REG}; + use crate::extension::{Extension, ExtensionSet, TypeDefBound, EMPTY_REG, PRELUDE_REGISTRY}; use crate::hugr::hugrmut::sealed::HugrMutInternals; use crate::hugr::{HugrError, HugrMut, NodeType}; use crate::ops::dataflow::IOTrait; @@ -1131,7 +1131,7 @@ mod test { let f_handle = f_builder.finish_with_outputs(f_inputs)?; let [f_output] = f_handle.outputs_arr(); main.finish_with_outputs([f_output])?; - let handle = module_builder.hugr().validate(&prelude_registry()); + let handle = module_builder.hugr().validate(&PRELUDE_REGISTRY); assert_matches!( handle, @@ -1168,7 +1168,7 @@ mod test { let f_handle = f_builder.finish_with_outputs(f_inputs)?; let [f_output] = f_handle.outputs_arr(); main.finish_with_outputs([f_output])?; - let handle = module_builder.hugr().validate(&prelude_registry()); + let handle = module_builder.hugr().validate(&PRELUDE_REGISTRY); assert_matches!( handle, Err(ValidationError::ExtensionError( @@ -1230,7 +1230,7 @@ mod test { let [output] = builder.finish_with_outputs([])?.outputs_arr(); main.finish_with_outputs([output])?; - let handle = module_builder.hugr().validate(&prelude_registry()); + let handle = module_builder.hugr().validate(&PRELUDE_REGISTRY); assert_matches!( handle, Err(ValidationError::ExtensionError( @@ -1268,7 +1268,7 @@ mod test { hugr.connect(input, 0, output, 0)?; assert_matches!( - hugr.validate(&prelude_registry()), + hugr.validate(&PRELUDE_REGISTRY), Err(ValidationError::ExtensionError( ExtensionError::TgtExceedsSrcExtensionsAtPort { .. } )) @@ -1327,7 +1327,7 @@ mod test { cause: SignatureError::ExtensionNotFound(PRELUDE.name.clone()) }) ); - h.validate(&prelude_registry()).unwrap(); + h.validate(&PRELUDE_REGISTRY).unwrap(); } #[test]