Std

Mainly a port of Rust's std.
git clone https://git.philomathiclife.com/repos/Std
Log | Files | Refs | README

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