diff --git a/BeefLibs/corlib/src/Span.bf b/BeefLibs/corlib/src/Span.bf index f787d05e..4931bbaf 100644 --- a/BeefLibs/corlib/src/Span.bf +++ b/BeefLibs/corlib/src/Span.bf @@ -299,6 +299,8 @@ namespace System return Enumerator(this); } + public ReverseEnumerator Reversed => ReverseEnumerator(this); + public override void ToString(String strBuffer) { strBuffer.Append("("); @@ -380,6 +382,95 @@ namespace System } + public Result GetNext() mut + { + if (!MoveNext()) + return .Err; + return Current; + } + + public Result GetNextRef() mut + { + if (!MoveNext()) + return .Err; + return &CurrentRef; + } + } + + public struct ReverseEnumerator : IEnumerator, IRefEnumerator + { + private Span mList; + private int mIndex; + private T* mCurrent; + + public this(Span list) + { + mList = list; + mIndex = list.mLength - 1; + mCurrent = null; + } + + public void Dispose() + { + } + + public bool MoveNext() mut + { + if (mIndex >= 0) + { + mCurrent = &mList.mPtr[mIndex]; + mIndex--; + return true; + } + return MoveNextRare(); + } + + private bool MoveNextRare() mut + { + mIndex = mList.mLength + 1; + mCurrent = null; + return false; + } + + public T Current + { + get + { + return *mCurrent; + } + } + + public ref T CurrentRef + { + get + { + return ref *mCurrent; + } + } + + public int Index + { + get + { + return mIndex + 1; + } + } + + public int Length + { + get + { + return mList.mLength; + } + } + + public void Reset() mut + { + mIndex = 0; + mCurrent = null; + } + + public Result GetNext() mut { if (!MoveNext())