using System; using System.Collections; namespace Tests { class Generics2 { struct TestFunc { private int mId; private Del mComparer; public static TestFunc Create(int id, Del comparer) { return .() { mId = id, mComparer = comparer }; } public bool CheckDlg(T item) { return false; } public bool CheckDlg(T item) where Del : delegate bool(T) { return mComparer(item); } public bool CheckDlg(T item) where Del : delegate bool(int, T) { return mComparer(mId, item); } public bool CallCheck(T val) { return CheckDlg(val); } } struct Iterator { public static Iterator Wrap(TCollection items) where TCollection : concrete, IEnumerable { return .(items.GetEnumerator()); } } struct Iterator : IDisposable where TEnum : concrete, IEnumerator { public TEnum mEnum; public this(TEnum items) { mEnum = items; } [SkipCall] public void Dispose() { } } public static bool SequenceEquals(this TLeft left, TRight right) where TLeft : concrete, IEnumerable where TRight : concrete, IEnumerable where bool : operator TSource == TSource { using (let iterator0 = Iterator.Wrap(left)) { var e0 = iterator0.mEnum; using (let iterator1 = Iterator.Wrap(right)) { var e1 = iterator1.mEnum; while (true) { switch (e0.GetNext()) { case .Ok(let i0): switch (e1.GetNext()) { case .Ok(let i1): if (i0 != i1) return false; case .Err: return false; } case .Err: return e1.GetNext() case .Err; } } } } } class IFaceA where T0 : Dictionary where T1 : IHashable { Dictionary mDict; } public static void MethodA() where T0 : Dictionary where T1 : IHashable { } [Test] public static void TestBasics() { let testF = TestFunc.Create(10, scope (s) => s == "Str"); Test.Assert(testF.CallCheck("Str")); Test.Assert(!testF.CallCheck("Str2")); List iList = scope .() { 1, 2, 3 }; Span iSpan = iList; Test.Assert(iList.SequenceEquals(iSpan)); iList.Add(4); Test.Assert(!iList.SequenceEquals(iSpan)); } } }