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

com.github.steveash.jg2p.util.NestedLoopPairIterable Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2014 Steve Ash
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.github.steveash.jg2p.util;

import com.google.common.collect.AbstractIterator;

import org.apache.commons.lang3.tuple.Pair;

import java.util.Iterator;

/**
 * Allows you to lazily do a nested loop of P x Q where P is the outer and Q is the inner
 *
 * @author Steve Ash
 */
public class NestedLoopPairIterable implements Iterable> {

  public static  NestedLoopPairIterable of(Iterable

outerSource, Iterable innerSource) { return new NestedLoopPairIterable<>(outerSource, innerSource); } private final Iterable

outerSource; private final Iterable innerSource; private NestedLoopPairIterable(Iterable

outerSource, Iterable innerSource) { this.outerSource = outerSource; this.innerSource = innerSource; } @Override public Iterator> iterator() { return new AbstractIterator>() { private final Iterator

outer = outerSource.iterator(); private Iterator inner = innerSource.iterator(); private P lastOuter; private boolean hasAtLeastOne = false; { // setup for the initial state if (outer.hasNext() && inner.hasNext()) { lastOuter = outer.next(); hasAtLeastOne = true; } } @Override protected Pair computeNext() { if (!hasAtLeastOne) { return endOfData(); } if (!inner.hasNext()) { if (!outer.hasNext()) { return endOfData(); } lastOuter = outer.next(); inner = innerSource.iterator(); } return Pair.of(lastOuter, inner.next()); } }; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy