Upsilon/Upsilon/BaseTypes/ScriptIterator.cs

90 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using Upsilon.BaseTypes.ScriptTypeInterfaces;
namespace Upsilon.BaseTypes
{
internal abstract class ScriptIterator : ScriptType, IIterable
{
public IIterable BaseIterator { get; }
public override TypeContainer Type => BaseTypes.Type.Table;
public ScriptIterator(IIterable baseIterator)
{
BaseIterator = baseIterator;
}
public override object ToCSharpObject()
{
return GetScriptEnumerator();
}
public override System.Type GetCSharpType()
{
return typeof(IEnumerator<ScriptType>);
}
public ScriptType GetValueFromIndex(ScriptType index)
{
throw new InvalidOperationException();
}
public abstract IEnumerator<ScriptType> GetScriptEnumerator();
public bool Contains(ScriptType obj)
{
return false;
}
public void Delete(ScriptType key)
{
throw new InvalidOperationException();
}
}
internal class UpTillNullPairsScriptIterator : ScriptIterator
{
public UpTillNullPairsScriptIterator(IIterable baseIterator) : base(baseIterator)
{
}
public override IEnumerator<ScriptType> GetScriptEnumerator()
{
using(var baseEnumerator = BaseIterator.GetScriptEnumerator())
{
while (baseEnumerator.MoveNext())
{
var key = baseEnumerator.Current;
if (key == null || key.Type == BaseTypes.Type.Nil)
break;
var value = BaseIterator.GetValueFromIndex(key);
if (value.Type == BaseTypes.Type.Nil)
break;
yield return new SimpleScriptTable(new List<ScriptType>(){key, value});
}
}
}
}
internal class PairsScriptIterator : ScriptIterator
{
public PairsScriptIterator(IIterable baseIterator) : base(baseIterator)
{
}
public override IEnumerator<ScriptType> GetScriptEnumerator()
{
using(var baseEnumerator = BaseIterator.GetScriptEnumerator())
{
while (baseEnumerator.MoveNext())
{
var key = baseEnumerator.Current;
var value = BaseIterator.GetValueFromIndex(key);
if (value.Type != BaseTypes.Type.Nil)
yield return new SimpleScriptTable(new List<ScriptType>(){key, value});
}
}
}
}
}