    001/*
    002 * Copyright (c) 2007-2017 Xplenty, 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.util;
    022
    023import java.util.Iterator;
    024
    025/**
    026 * Class SingleValueIterator is a convenience to creating an {@link Iterator} that returns one value for use
    027 * with interfaces that only accept Iterator instances.
    028 * <p/>
    029 * If given a {@code null} value, it will be assumed this Iterator instance has no value, and {@link #hasNext()}
    030 * will return false.
    031 */
    032public class SingleValueIterator<Value> implements Iterator<Value>
    033  {
    034  public static final SingleValueIterator EMPTY = new SingleValueIterator();
    035
    036  private boolean hasValue = true;
    037  protected Value value;
    038
    039  public SingleValueIterator()
    040    {
    041    this.hasValue = false;
    042    }
    043
    044  public SingleValueIterator( Value value )
    045    {
    046    this.hasValue = value != null;
    047    this.value = value;
    048    }
    049
    050  @Override
    051  public boolean hasNext()
    052    {
    053    return hasValue;
    054    }
    055
    056  @Override
    057  public Value next()
    058    {
    059    if( !hasValue )
    060      throw new IllegalStateException( "no value available" );
    061
    062    try
    063      {
    064      return value;
    065      }
    066    finally
    067      {
    068      hasValue = false;
    069      }
    070    }
    071
    072  @Override
    073  public void remove()
    074    {
    075    throw new UnsupportedOperationException( "unimplimented" );
    076    }
    077
    078  public void reset( Value value )
    079    {
    080    this.hasValue = value != null;
    081    this.value = value;
    082    }
    083  }