All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snapscript.core.type.extend.IteratorExtension Maven / Gradle / Ivy

package org.snapscript.core.type.extend;

import static java.lang.Boolean.TRUE;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.snapscript.common.Consumer;

public class IteratorExtension {

   public IteratorExtension() {
      super();
   }
   
   public  Iterator limit(Iterator iterator, int limit) {
      return new LimitIterator(iterator, limit);
   }

   public  Iterator filter(Iterator iterator, Consumer filter) {
      return new FilterIterator(iterator, filter);
   }

   public  Iterator reverse(Iterator iterator) {
      List list = new ArrayList();
      
      while(iterator.hasNext()) {
         T value = iterator.next();
         list.add(value);
      }
      if(!list.isEmpty()) {
         Collections.reverse(list);
      }
      return list.iterator();
   }
   
   public  List gather(Iterator iterator) {
      List list = new ArrayList();
      
      while(iterator.hasNext()) {
         T value = iterator.next();
         list.add(value);
      }
      return list;
   }

   private static class FilterIterator implements Iterator {
      
      private Consumer filter;
      private Iterator iterator;
      private T next;
      
      public FilterIterator(Iterator iterator, Consumer filter) {
         this.iterator = iterator;
         this.filter = filter;
      }

      @Override
      public boolean hasNext() {
         if(next == null) {
            while(iterator.hasNext()) {
               T value = iterator.next();
               Object accept = filter.consume(value);
               
               if(TRUE.equals(accept)) {
                  next = value;
                  return true;
               }
            }
            return false;
         }
         return true;
      }

      @Override
      public T next() {
         if(hasNext()) {
            T result = next;
            next = null;
            return result;
         }
         return null;
      }
   }
   
   private static class LimitIterator implements Iterator {
      
      private Iterator iterator;
      private int limit;
      
      public LimitIterator(Iterator iterator, int limit) {
         this.iterator = iterator;
         this.limit = limit;
      }

      @Override
      public boolean hasNext() {
         return limit > 0 && iterator.hasNext();
      }

      @Override
      public T next() {
         if(limit-- > 0) {
            return iterator.next();
         }
         return null;
      }
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy