Successors.cs (2617B)
1 using Std.Convert; 2 using Std.Maybe; 3 using Std.Ops; 4 using Std.Result; 5 using System; 6 using System.Runtime.InteropServices; 7 #region Namespaces 8 namespace Std.Iter { 9 #region Types 10 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 0)] 11 public struct Successors<T>: IFusedIterator<T>, IInto<Successors<T>> where T: notnull { 12 13 #region Type-level Constructors 14 #endregion 15 16 #region Instance Constructors 17 public Successors() => throw new InvalidOperationException("Parameterless constructor is not allowed to be called!"); 18 internal Successors(Maybe<T> first, FnIn<T, Maybe<T>> succ) => (_next, _succ) = (first, succ); 19 #endregion 20 21 #region Type-level Fields 22 #endregion 23 24 #region Instance Fields 25 readonly FnIn<T, Maybe<T>> _succ; 26 Maybe<T> _next; 27 #endregion 28 29 #region Type-level Properties 30 #endregion 31 32 #region Instance Properties 33 #endregion 34 35 #region Type-level Functions 36 #endregion 37 38 #region Instance Functions 39 public Result<Unit, ulong> AdvanceBy(ulong n) => IIterator<T>.AdvanceByDefault(ref this, n); 40 public ulong Count() => IIterator<T>.CountDefault(ref this); 41 public override readonly bool Equals(object? _) => false; 42 public TInit Fold<TInit>(TInit init, Fn<TInit, T, TInit> f) where TInit: notnull => IIterator<T>.FoldDefault(ref this, init, f); 43 public override readonly int GetHashCode() => 0; 44 public readonly Successors<T> Into() => this; 45 public Maybe<T> Last() => IIterator<T>.LastDefault(ref this); 46 public Maybe<T> Next() { 47 48 var item = _next; 49 _next = Maybe<T>.None(); 50 51 if (item.IsNone) { 52 return Maybe<T>.None(); 53 } 54 _next = _succ(in item._some); 55 return new(item._some); 56 } 57 public readonly Prod<ulong, Maybe<ulong>> SizeHint() => _next.IsSome ? new(1ul, Maybe<ulong>.None()) : new(ulong.MinValue, new(ulong.MinValue)); 58 public override readonly string ToString() => string.Empty; 59 public Result<TInit, TErr> TryFold<TInit, TErr>(TInit init, Fn<TInit, T, Result<TInit, TErr>> f) where TInit: notnull where TErr: notnull => IIterator<T>.TryFoldDefault(ref this, init, f); 60 readonly Result<Successors<T>, Bottom> ITryInto<Successors<T>, Bottom>.TryInto() => new(this); 61 #endregion 62 63 #region Operators 64 #endregion 65 66 #region Types 67 #endregion 68 } 69 #endregion 70 71 #region Namespaces 72 #endregion 73 } 74 #endregion