diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/src/lib.rs b/src/lib.rs index 9e84de1..f41b4c6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,12 +5,41 @@ mod vm; pub use pattern::Pattern; -// TODO +// TODO investigate if this should be PatternTypes: Default +/// Defines the types and operations used for matching. pub trait PatternTypes { /// The value type. type Value; - type Iter; + + /// 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<Box<dyn Iterator<Item=(&'b Self::Value, &'b Self::Value)> + '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<Option<(&'b Self::Value, &'b Self::Value)>> { + // 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 -pub type Predicate<T> = dyn (Fn(&<T as PatternTypes>::Value) -> bool) + Send + Sync; +type Predicate<T> = dyn (Fn(&<T as PatternTypes>::Value) -> bool) + Send + Sync; |