/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package pt.isel.mpd14.aula32;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;
import static pt.isel.mpd14.aula32.ReflectUtils.and;
/**
*
* @author Miguel Gamboa at CCISEL
*/
class ReflectIterableEager<T> implements ReflectIterable<T> {
final Iterable<T> src;
final Predicate<T> pred;
public ReflectIterableEager(Iterable<T> src, Predicate<T> pred) {
this.src = src;
this.pred = pred;
}
public ReflectIterableEager(Iterable<T> src) {
this.src = src;
this.pred = null;
}
@Override
public ReflectIterable<T> filter(String fieldName, Object expected) {
Predicate<T> newPred = and(pred, new ReflectPredicate<>(fieldName, expected));
return new ReflectIterableEager<T>(src, newPred);
}
@Override
public Iterator<T> iterator() {
if(pred == null) return src.iterator();
List<T> res = new LinkedList<T>();
for (T item : src) {
if(pred.test(item))
res.add(item);
}
return res.iterator();
}
}