view src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle-main/util/IterableConverter.cs @ 17:01a08cf4b2d9

Liq Files
author Kazuma
date Mon, 07 Nov 2016 01:05:24 +0900
parents abe0c247f5a5
children
line wrap: on
line source

using UnityEngine;
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<A,B> : IEnumerator<A>
	{
		public List<A> appLines { get; set; }

		private IEnumerator<B> iterator;
		private Converter<A,B> converter;

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

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

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

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

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

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


	public interface Converter<A,B>{
		A conv (B _b);
	}

}