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

com.reandroid.utils.collection.CombiningIterator Maven / Gradle / Ivy

/*
 *  Copyright (C) 2022 github.com/REAndroid
 *
 *  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.reandroid.utils.collection;

import java.util.Iterator;
import java.util.NoSuchElementException;

public class CombiningIterator implements Iterator {
    private Iterator iterator1;
    private Iterator iterator2;
    private Iterator iterator3;
    private Iterator iterator4;
    private Iterator> iteratorIterator;

    private Iterator mCurrentIterator;
    private T mCurrentItem;


    public CombiningIterator(Iterator iterator1, Iterator iterator2, Iterator iterator3, Iterator> iteratorIterator){
        this.iterator1 = iterator1;
        this.iterator2 = iterator2;
        this.iterator3 = iterator3;
        this.iteratorIterator = iteratorIterator;
    }
    public CombiningIterator(Iterator iterator1, Iterator iterator2, Iterator iterator3){
        this(iterator1, iterator2, iterator3, null);
    }
    public CombiningIterator(Iterator iterator1, Iterator iterator2){
        this(iterator1, iterator2, null, null);
    }
    public CombiningIterator(Iterator iterator1, Iterator> iteratorIterator, Void ignored){
        this(iterator1, null, null, iteratorIterator);
    }
    public CombiningIterator(Iterator> iteratorIterator){
        this(null, null, null, iteratorIterator);
    }

    @Override
    public boolean hasNext() {
        return getCurrentItem() != null;
    }
    @Override
    public T next() {
        T item = getCurrentItem();
        if(item == null){
            throw new NoSuchElementException();
        }
        this.mCurrentItem = null;
        return item;
    }
    private T getCurrentItem(){
        T item = mCurrentItem;
        if(item == null){
            item = readNext();
            this.mCurrentItem = item;
        }
        return item;
    }
    private T readNext(){
        Iterator iterator = this.iterator1;
        if(iterator != null){
            while (iterator.hasNext()){
                T item = iterator.next();
                if(item != null){
                    return item;
                }
            }
            this.iterator1 = null;
        }
        iterator = this.iterator2;
        if(iterator != null){
            while (iterator.hasNext()){
                T item = iterator.next();
                if(item != null){
                    return item;
                }
            }
            this.iterator2 = null;
        }
        iterator = this.iterator3;
        if(iterator != null){
            while (iterator.hasNext()){
                T item = iterator.next();
                if(item != null){
                    return item;
                }
            }
            this.iterator3 = null;
        }
        iterator = this.iterator4;
        if(iterator != null){
            while (iterator.hasNext()){
                T item = iterator.next();
                if(item != null){
                    return item;
                }
            }
            this.iterator4 = null;
        }
        return readCurrentIterator();
    }
    private T readCurrentIterator(){
        Iterator iterator = getCurrentIterator();
        while (iterator != null){
            while (iterator.hasNext()){
                T item = iterator.next();
                if(item != null){
                    return item;
                }
            }
            this.mCurrentIterator = null;
            iterator = getCurrentIterator();
        }
        return null;
    }

    private Iterator getCurrentIterator() {
        if(mCurrentIterator != null){
            return mCurrentIterator;
        }
        Iterator> iteratorIterator = this.iteratorIterator;
        if(iteratorIterator == null){
            return null;
        }
        Iterator iterator = null;
        while (iteratorIterator.hasNext() && iterator == null){
            iterator = iteratorIterator.next();
        }
        mCurrentIterator = iterator;
        return iterator;
    }


    public static Iterator of(Iterator iterator1, Iterator> iteratorIterator){
        if(!iteratorIterator.hasNext()){
            return iterator1;
        }
        CombiningIterator iterator = new CombiningIterator<>(iterator1, null);
        iterator.iteratorIterator = iteratorIterator;
        return iterator;
    }
    public static Iterator of(T1 item, Iterator> iteratorIterator){
        if(!iteratorIterator.hasNext()){
            return SingleIterator.of(item);
        }
        CombiningIterator iterator = new CombiningIterator<>(null, null);
        iterator.mCurrentItem = item;
        iterator.iteratorIterator = iteratorIterator;
        return iterator;
    }
    @SuppressWarnings("unchecked")
    public static Iterator two(Iterator iterator1, Iterator iterator2){
        if(!iterator1.hasNext()){
            return (Iterator) iterator2;
        }
        if(!iterator2.hasNext()){
            return (Iterator) iterator1;
        }
        return new CombiningIterator<>(iterator1, iterator2);
    }
    public static Iterator three(Iterator iterator1, Iterator iterator2, Iterator iterator3){
        return new CombiningIterator<>(iterator1, iterator2, iterator3);
    }
    public static Iterator four(Iterator iterator1, Iterator iterator2, Iterator iterator3, Iterator iterator4){
        CombiningIterator iterator = new CombiningIterator<>(iterator1, iterator2, iterator3);
        iterator.iterator4 = iterator4;
        return iterator;
    }
    @SuppressWarnings("unchecked")
    public static Iterator singleOne(T1 item, Iterator iterator1){
        if(item == null){
            return (Iterator) iterator1;
        }
        CombiningIterator iterator = new CombiningIterator<>(iterator1, null);
        iterator.mCurrentItem = item;
        return iterator;
    }
    @SuppressWarnings("unchecked")
    public static Iterator singleTwo(T1 item, Iterator iterator1, Iterator iterator2){
        if(item == null){
            return (Iterator) iterator1;
        }
        CombiningIterator iterator = new CombiningIterator<>(iterator1, iterator2);
        iterator.mCurrentItem = item;
        return iterator;
    }
    @SuppressWarnings("unchecked")
    public static Iterator singleThree(T1 item, Iterator iterator1, Iterator iterator2, Iterator iterator3){
        if(item == null){
            return (Iterator) iterator1;
        }
        CombiningIterator iterator = new CombiningIterator<>(iterator1, iterator2, iterator3);
        iterator.mCurrentItem = item;
        return iterator;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy