Skip to content

Commit e20d246

Browse files
committed
impl Trait
1 parent 111e8d2 commit e20d246

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

src/join.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,41 @@
22
33
use super::{Variable, Relation};
44

5-
pub fn join_into<Key: Ord, Val1: Ord, Val2: Ord, Result: Ord, F: Fn(&Key, &Val1, &Val2)->Result>(
5+
pub fn join_into<Key: Ord, Val1: Ord, Val2: Ord, Result: Ord>(
66
input1: &Variable<(Key, Val1)>,
77
input2: &Variable<(Key, Val2)>,
88
output: &Variable<Result>,
9-
logic: F) {
9+
mut logic: impl FnMut(&Key, &Val1, &Val2)->Result) {
1010

1111
let mut results = Vec::new();
1212

1313
let recent1 = input1.recent.borrow();
1414
let recent2 = input2.recent.borrow();
1515

16-
for batch2 in input2.stable.borrow().iter() {
17-
join_helper(&recent1, &batch2, |k,v1,v2| results.push(logic(k,v1,v2)));
18-
}
16+
{ // scoped to let `closure` drop borrow of `results`.
1917

20-
for batch1 in input1.stable.borrow().iter() {
21-
join_helper(&batch1, &recent2, |k,v1,v2| results.push(logic(k,v1,v2)));
22-
}
18+
let mut closure = |k: &Key, v1: &Val1, v2: &Val2| results.push(logic(k,v1,v2));
19+
20+
for batch2 in input2.stable.borrow().iter() {
21+
join_helper(&recent1, &batch2, &mut closure);
22+
}
2323

24-
join_helper(&recent1, &recent2, |k,v1,v2| results.push(logic(k,v1,v2)));
24+
for batch1 in input1.stable.borrow().iter() {
25+
join_helper(&batch1, &recent2, &mut closure);
26+
}
27+
28+
join_helper(&recent1, &recent2, &mut closure);
29+
}
2530

2631
output.insert(Relation::from_vec(results));
2732
}
2833

2934
/// Moves all recent tuples from `input1` that are not present in `input2` into `output`.
30-
pub fn antijoin_into<Key: Ord, Val: Ord, Result: Ord, F: Fn(&Key, &Val)->Result>(
35+
pub fn antijoin_into<Key: Ord, Val: Ord, Result: Ord>(
3136
input1: &Variable<(Key, Val)>,
3237
input2: &Relation<Key>,
3338
output: &Variable<Result>,
34-
logic: F) {
39+
mut logic: impl FnMut(&Key, &Val)->Result) {
3540

3641
let mut results = Vec::new();
3742
let mut tuples2 = &input2[..];
@@ -46,7 +51,10 @@ pub fn antijoin_into<Key: Ord, Val: Ord, Result: Ord, F: Fn(&Key, &Val)->Result>
4651
output.insert(Relation::from_vec(results));
4752
}
4853

49-
fn join_helper<K: Ord, V1, V2, F: FnMut(&K, &V1, &V2)>(mut slice1: &[(K,V1)], mut slice2: &[(K,V2)], mut result: F) {
54+
fn join_helper<K: Ord, V1, V2>(
55+
mut slice1: &[(K,V1)],
56+
mut slice2: &[(K,V2)],
57+
mut result: impl FnMut(&K,&V1,&V2)) {
5058

5159
while !slice1.is_empty() && !slice2.is_empty() {
5260

@@ -81,7 +89,7 @@ fn join_helper<K: Ord, V1, V2, F: FnMut(&K, &V1, &V2)>(mut slice1: &[(K,V1)], mu
8189
}
8290
}
8391

84-
pub fn gallop<T, F: Fn(&T)->bool>(mut slice: &[T], cmp: F) -> &[T] {
92+
pub fn gallop<T>(mut slice: &[T], mut cmp: impl FnMut(&T)->bool) -> &[T] {
8593
// if empty slice, or already >= element, return
8694
if slice.len() > 0 && cmp(&slice[0]) {
8795
let mut step = 1;

src/lib.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ pub struct Variable<Tuple: Ord> {
149149
/// A useful name for the variable.
150150
name: String,
151151
/// A list of relations whose union are the accepted tuples.
152-
stable: Rc<RefCell<Vec<Relation<Tuple>>>>,
152+
pub stable: Rc<RefCell<Vec<Relation<Tuple>>>>,
153153
/// A list of recent tuples, still to be processed.
154-
recent: Rc<RefCell<Relation<Tuple>>>,
154+
pub recent: Rc<RefCell<Relation<Tuple>>>,
155155
/// A list of future tuples, to be introduced.
156156
to_add: Rc<RefCell<Vec<Relation<Tuple>>>>,
157157
}
@@ -181,11 +181,11 @@ impl<Tuple: Ord> Variable<Tuple> {
181181
/// let result = variable.complete();
182182
/// assert_eq!(result.len(), 121);
183183
/// ```
184-
pub fn from_join<K: Ord,V1: Ord, V2: Ord, F: Fn(&K,&V1,&V2)->Tuple>(
184+
pub fn from_join<K: Ord,V1: Ord, V2: Ord>(
185185
&self,
186186
input1: &Variable<(K,V1)>,
187187
input2: &Variable<(K,V2)>,
188-
logic: F)
188+
logic: impl FnMut(&K,&V1,&V2)->Tuple)
189189
{
190190
join::join_into(input1, input2, self, logic)
191191
}
@@ -213,11 +213,11 @@ impl<Tuple: Ord> Variable<Tuple> {
213213
/// let result = variable.complete();
214214
/// assert_eq!(result.len(), 16);
215215
/// ```
216-
pub fn from_antijoin<K: Ord,V: Ord, F: Fn(&K,&V)->Tuple>(
216+
pub fn from_antijoin<K: Ord, V: Ord>(
217217
&self,
218218
input1: &Variable<(K,V)>,
219219
input2: &Relation<K>,
220-
logic: F)
220+
logic: impl FnMut(&K,&V)->Tuple)
221221
{
222222
join::antijoin_into(input1, input2, self, logic)
223223
}
@@ -252,7 +252,7 @@ impl<Tuple: Ord> Variable<Tuple> {
252252
/// let result = variable.complete();
253253
/// assert_eq!(result.len(), 74);
254254
/// ```
255-
pub fn from_map<T2: Ord, F: Fn(&T2)->Tuple>(&self, input: &Variable<T2>, logic: F) {
255+
pub fn from_map<T2: Ord>(&self, input: &Variable<T2>, logic: impl FnMut(&T2)->Tuple) {
256256
map::map_into(input, self, logic)
257257
}
258258
}
@@ -351,7 +351,7 @@ impl<Tuple: Ord> VariableTrait for Variable<Tuple> {
351351
}
352352

353353
// let mut total = 0;
354-
// for tuple in self.tuples.borrow().iter() {
354+
// for tuple in self.stable.borrow().iter() {
355355
// total += tuple.len();
356356
// }
357357

@@ -364,7 +364,7 @@ impl<Tuple: Ord> VariableTrait for Variable<Tuple> {
364364
// impl<Tuple: Ord> Drop for Variable<Tuple> {
365365
// fn drop(&mut self) {
366366
// let mut total = 0;
367-
// for batch in self.tuples.borrow().iter() {
367+
// for batch in self.stable.borrow().iter() {
368368
// total += batch.len();
369369
// }
370370
// println!("FINAL: {:?}\t{:?}", self.name, total);

src/map.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
33
use super::{Variable, Relation};
44

5-
pub fn map_into<T1: Ord, T2: Ord, F: Fn(&T1)->T2>(
5+
pub fn map_into<T1: Ord, T2: Ord>(
66
input: &Variable<T1>,
77
output: &Variable<T2>,
8-
logic: F) {
8+
mut logic: impl FnMut(&T1)->T2) {
99

1010
let mut results = Vec::new();
1111
let recent = input.recent.borrow();

0 commit comments

Comments
 (0)