Skip to content

Commit 79ae4c2

Browse files
authored
Merge pull request #49 from epage/ref
feat: Fix eq for str
2 parents 8864e29 + 7650e9e commit 79ae4c2

File tree

2 files changed

+76
-6
lines changed

2 files changed

+76
-6
lines changed

src/iter.rs

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,11 @@ where
5353
/// assert_eq!(true, predicate_fn.eval(&1));
5454
/// assert_eq!(false, predicate_fn.eval(&2));
5555
/// assert_eq!(true, predicate_fn.eval(&3));
56-
/// assert_eq!(false, predicate_fn.eval(&4));
57-
/// assert_eq!(true, predicate_fn.eval(&5));
56+
///
57+
/// let predicate_fn = predicate::in_iter(vec!["a", "c", "e"]).sort();
58+
/// assert_eq!(true, predicate_fn.eval("a"));
59+
/// assert_eq!(false, predicate_fn.eval("b"));
60+
/// assert_eq!(true, predicate_fn.eval("c"));
5861
/// ```
5962
pub fn sort(self) -> OrdInPredicate<T> {
6063
let mut items = self.inner;
@@ -72,6 +75,15 @@ where
7275
}
7376
}
7477

78+
impl<'a, T> Predicate<T> for InPredicate<&'a T>
79+
where
80+
T: PartialEq + fmt::Debug + ?Sized,
81+
{
82+
fn eval(&self, variable: &T) -> bool {
83+
self.inner.contains(&variable)
84+
}
85+
}
86+
7587
impl<T> fmt::Display for InPredicate<T>
7688
where
7789
T: PartialEq + fmt::Debug,
@@ -104,8 +116,11 @@ where
104116
/// assert_eq!(true, predicate_fn.eval(&1));
105117
/// assert_eq!(false, predicate_fn.eval(&2));
106118
/// assert_eq!(true, predicate_fn.eval(&3));
107-
/// assert_eq!(false, predicate_fn.eval(&4));
108-
/// assert_eq!(true, predicate_fn.eval(&5));
119+
///
120+
/// let predicate_fn = predicate::in_iter(vec!["a", "c", "e"]);
121+
/// assert_eq!(true, predicate_fn.eval("a"));
122+
/// assert_eq!(false, predicate_fn.eval("b"));
123+
/// assert_eq!(true, predicate_fn.eval("c"));
109124
/// ```
110125
pub fn in_iter<I, T>(iter: I) -> InPredicate<T>
111126
where
@@ -143,6 +158,15 @@ where
143158
}
144159
}
145160

161+
impl<'a, T> Predicate<T> for OrdInPredicate<&'a T>
162+
where
163+
T: Ord + fmt::Debug + ?Sized,
164+
{
165+
fn eval(&self, variable: &T) -> bool {
166+
self.inner.binary_search(&variable).is_ok()
167+
}
168+
}
169+
146170
impl<T> fmt::Display for OrdInPredicate<T>
147171
where
148172
T: Ord + fmt::Debug,
@@ -178,6 +202,15 @@ where
178202
}
179203
}
180204

205+
impl<'a, T> Predicate<T> for HashableInPredicate<&'a T>
206+
where
207+
T: Hash + Eq + fmt::Debug + ?Sized,
208+
{
209+
fn eval(&self, variable: &T) -> bool {
210+
self.inner.contains(&variable)
211+
}
212+
}
213+
181214
impl<T> fmt::Display for HashableInPredicate<T>
182215
where
183216
T: Hash + Eq + fmt::Debug,
@@ -204,8 +237,11 @@ where
204237
/// assert_eq!(true, predicate_fn.eval(&1));
205238
/// assert_eq!(false, predicate_fn.eval(&2));
206239
/// assert_eq!(true, predicate_fn.eval(&3));
207-
/// assert_eq!(false, predicate_fn.eval(&4));
208-
/// assert_eq!(true, predicate_fn.eval(&5));
240+
///
241+
/// let predicate_fn = predicate::in_hash(vec!["a", "c", "e"]);
242+
/// assert_eq!(true, predicate_fn.eval("a"));
243+
/// assert_eq!(false, predicate_fn.eval("b"));
244+
/// assert_eq!(true, predicate_fn.eval("c"));
209245
/// ```
210246
pub fn in_hash<I, T>(iter: I) -> HashableInPredicate<T>
211247
where

src/ord.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ where
5353
}
5454
}
5555

56+
impl<'a, T> Predicate<T> for EqPredicate<&'a T>
57+
where
58+
T: PartialEq + fmt::Debug + ?Sized,
59+
{
60+
fn eval(&self, variable: &T) -> bool {
61+
match self.op {
62+
EqOps::Equal => variable.eq(self.constant),
63+
EqOps::NotEqual => variable.ne(self.constant),
64+
}
65+
}
66+
}
67+
5668
impl<T> fmt::Display for EqPredicate<T>
5769
where
5870
T: fmt::Debug,
@@ -73,6 +85,10 @@ where
7385
/// let predicate_fn = predicate::eq(5);
7486
/// assert_eq!(true, predicate_fn.eval(&5));
7587
/// assert_eq!(false, predicate_fn.eval(&10));
88+
///
89+
/// let predicate_fn = predicate::eq("Hello");
90+
/// assert_eq!(true, predicate_fn.eval("Hello"));
91+
/// assert_eq!(false, predicate_fn.eval("Goodbye"));
7692
/// ```
7793
pub fn eq<T>(constant: T) -> EqPredicate<T>
7894
where
@@ -153,6 +169,20 @@ where
153169
}
154170
}
155171

172+
impl<'a, T> Predicate<T> for OrdPredicate<&'a T>
173+
where
174+
T: PartialOrd + fmt::Debug + ?Sized,
175+
{
176+
fn eval(&self, variable: &T) -> bool {
177+
match self.op {
178+
OrdOps::LessThan => variable.lt(self.constant),
179+
OrdOps::LessThanOrEqual => variable.le(self.constant),
180+
OrdOps::GreaterThanOrEqual => variable.ge(self.constant),
181+
OrdOps::GreaterThan => variable.gt(self.constant),
182+
}
183+
}
184+
}
185+
156186
impl<T> fmt::Display for OrdPredicate<T>
157187
where
158188
T: fmt::Debug,
@@ -173,6 +203,10 @@ where
173203
/// let predicate_fn = predicate::lt(5);
174204
/// assert_eq!(true, predicate_fn.eval(&4));
175205
/// assert_eq!(false, predicate_fn.eval(&6));
206+
///
207+
/// let predicate_fn = predicate::lt("b");
208+
/// assert_eq!(true, predicate_fn.eval("a"));
209+
/// assert_eq!(false, predicate_fn.eval("c"));
176210
/// ```
177211
pub fn lt<T>(constant: T) -> OrdPredicate<T>
178212
where

0 commit comments

Comments
 (0)