001/* 002 * Copyright (c) 2007-2015 Concurrent, Inc. All Rights Reserved. 003 * 004 * Project and contact information: http://www.cascading.org/ 005 * 006 * This file is part of the Cascading project. 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020 021package cascading.tuple; 022 023import java.util.Iterator; 024 025import cascading.tuple.util.Resettable; 026 027/** 028 * TupleChainIterator chains the given Iterators into a single Iterator. 029 * <p/> 030 * As one iterator is completed, it will be closed and a new one will start. 031 */ 032public class TupleChainIterable implements Iterable<Tuple>, Resettable<Iterable<Tuple>> 033 { 034 /** Field iterator */ 035 Iterable<Tuple>[] iterables; 036 037 public TupleChainIterable( Iterable<Tuple> first, Iterable<Tuple>... iterables ) 038 { 039 Iterable<Tuple>[] initial; 040 041 if( first instanceof TupleChainIterable ) 042 initial = ( (TupleChainIterable) first ).iterables; 043 else 044 initial = new Iterable[]{first}; 045 046 this.iterables = new Iterable[ initial.length + iterables.length ]; 047 048 System.arraycopy( initial, 0, this.iterables, 0, initial.length ); 049 System.arraycopy( iterables, 0, this.iterables, initial.length, iterables.length ); 050 } 051 052 053 @Override 054 public Iterator<Tuple> iterator() 055 { 056 Iterator<Tuple>[] iterators = new Iterator[ iterables.length ]; 057 058 for( int i = 0; i < iterables.length; i++ ) 059 iterators[ i ] = iterables[ i ].iterator(); 060 061 return new TupleChainIterator( iterators ); 062 } 063 064 @Override 065 public void reset( Iterable<Tuple>... iterables ) 066 { 067 this.iterables = iterables; 068 } 069 }