pub mod errors; mod parser; mod pattern; mod vm; pub use pattern::Pattern; // TODO investigate if this should be PatternTypes: Default /// Defines the types and operations used for matching. pub trait PatternTypes { /// The value type. type Value; /// The owned key type. May be uninhabited. // TODO replace with GATs. type Key; /// Returns an iterator over key-value pairs contained within an item, or /// None if this operation is unsupported for the given value. fn pairs<'b>( item: &'b Self::Value ) -> Option + 'b>> { // TODO remove these default impls that only exist for testing purposes let x = None; Some(Box::new(x.into_iter())) } /// Returns an optional key-value pair keyed by the given key, or None if /// this operation is unsupported for the given value. fn get<'a, 'b>( item: &'b Self::Value, key: &'a str ) -> Option> { // TODO remove these default impls that only exist for testing purposes Some(None) } /// Returns whether two values are the same/equivalent. This must provide /// the same guarantees as PartialEq. In fact, this is a replacement for /// PartialEq for cases where it's not possible to just use PartialEq. fn matches(left: &Self::Value, right: &Self::Value) -> bool; } // TODO type Predicate = dyn (Fn(&::Value) -> bool) + Send + Sync;