90 lines
2.6 KiB
C#
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});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} |