view Main/jungle-main/util/IterableConverter.cs @ 35:f2ea780b3e80

fix
author Kazuma Takeda
date Wed, 22 Feb 2017 16:30:19 +0900
parents 9588ad364fdd
children
line wrap: on
line source

using System.Collections.Generic;
using System.Collections;
using System;

public class IterableConverter<A,B> : IEnumerable<A> {
	private IEnumerable<B> iterable;
	private Converter<A,B> converter;


	IEnumerator IEnumerable.GetEnumerator()
	{
		// call the generic version of the method
		return this.GetEnumerator();
	}

	public IEnumerator<A> GetEnumerator()
	{
		return iterator ();
	}

	public IterableConverter(IEnumerable<B> _iterable,Converter<A,B> _converter)
	{
		iterable = _iterable;
		converter = _converter;
	}

	public IEnumerator<A> iterator()
	{
		return new IteratorConverter<A,B>(iterable.GetEnumerator(),converter);
	}

	private class IteratorConverter<C,D> : IEnumerator<C>
	{
		public List<C> appLines { get; set; }

		private IEnumerator<D> iterator;
		private Converter<C,D> converter;

		public IteratorConverter(IEnumerator<D> _iterator,Converter<C,D> _converter)
		{
			iterator = _iterator;
			converter = _converter;
		}

		public bool MoveNext()
		{
			return iterator.MoveNext();
		}

		public C Current
		{
			get{
				return converter.conv (iterator.Current);
			}
		}

		public void Reset()
		{
			// ホントはremove?
			iterator.Reset();
		}

		object IEnumerator.Current
		{
			get { return appLines; }
		}

		public void Dispose() {
			((IEnumerator<C>)this.appLines).Dispose ();
		}
	}


	public interface Converter<C,D>{
		C conv (D _b);
	}

}