public static void Sort <T>(T[] origKeys, IComparer <T> comparer)
        {
            T[] expectedKeys = origKeys.ToArray();
            Array.Sort(expectedKeys, comparer);

            byte[] origValues = new byte[origKeys.Length];
            new Random(42).NextBytes(origValues);
            byte[] expectedValues = origValues.ToArray();
            Array.Sort(origKeys.ToArray(), expectedValues, comparer);

            Span <T>    keys;
            Span <byte> values;

            if (comparer == null)
            {
                keys = origKeys.ToArray();
                MemoryExtensions.Sort(keys);
                Assert.Equal(expectedKeys, keys.ToArray());
            }

            keys = origKeys.ToArray();
            MemoryExtensions.Sort(keys, comparer);
            Assert.Equal(expectedKeys, keys.ToArray());

            keys = origKeys.ToArray();
            MemoryExtensions.Sort(keys, comparer != null ? (Comparison <T>)comparer.Compare : Comparer <T> .Default.Compare);
            Assert.Equal(expectedKeys, keys.ToArray());

            if (comparer == null)
            {
                keys   = origKeys.ToArray();
                values = origValues.ToArray();
                MemoryExtensions.Sort(keys, values);
                Assert.Equal(expectedKeys, keys.ToArray());
                Assert.Equal(expectedValues, values.ToArray());
            }

            keys   = origKeys.ToArray();
            values = origValues.ToArray();
            MemoryExtensions.Sort(keys, values, comparer);
            Assert.Equal(expectedKeys, keys.ToArray());
            Assert.Equal(expectedValues, values.ToArray());

            keys   = origKeys.ToArray();
            values = origValues.ToArray();
            MemoryExtensions.Sort(keys, values, comparer != null ? (Comparison <T>)comparer.Compare : Comparer <T> .Default.Compare);
            Assert.Equal(expectedKeys, keys.ToArray());
            Assert.Equal(expectedValues, values.ToArray());
        }
        public static void Sort_InvalidArguments_Throws()
        {
            AssertExtensions.Throws <ArgumentNullException>("comparison", () => MemoryExtensions.Sort(Span <byte> .Empty, (Comparison <byte>)null));
            AssertExtensions.Throws <ArgumentNullException>("comparison", () => MemoryExtensions.Sort(Span <byte> .Empty, Span <byte> .Empty, (Comparison <byte>)null));

            Assert.Throws <ArgumentException>(() => MemoryExtensions.Sort((Span <byte>) new byte[1], (Span <byte>) new byte[2]));
            Assert.Throws <ArgumentException>(() => MemoryExtensions.Sort((Span <byte>) new byte[2], (Span <byte>) new byte[1]));
            Assert.Throws <ArgumentException>(() => MemoryExtensions.Sort((Span <byte>) new byte[1], (Span <byte>) new byte[2], Comparer <byte> .Default.Compare));
            Assert.Throws <ArgumentException>(() => MemoryExtensions.Sort((Span <byte>) new byte[2], (Span <byte>) new byte[1], Comparer <byte> .Default.Compare));
            Assert.Throws <ArgumentException>(() => MemoryExtensions.Sort((Span <byte>) new byte[1], (Span <byte>) new byte[2], Comparer <byte> .Default));
            Assert.Throws <ArgumentException>(() => MemoryExtensions.Sort((Span <byte>) new byte[2], (Span <byte>) new byte[1], Comparer <byte> .Default));

            Assert.Throws <InvalidOperationException>(() => MemoryExtensions.Sort((Span <NotImcomparable>) new NotImcomparable[10]));
            Assert.Throws <InvalidOperationException>(() => MemoryExtensions.Sort((Span <NotImcomparable>) new NotImcomparable[10], (Span <byte>) new byte[10]));
        }
        public static void Sort_CovariantArraysAllowed(int overload)
        {
            Span <object> actual = Enumerable.Range(0, 10).Select(i => (object)i.ToString()).Reverse().ToArray();

            object[] expected = actual.ToArray();
            Array.Sort(expected);

            switch (overload)
            {
            case 0:
                MemoryExtensions.Sort(actual);
                break;

            case 1:
                MemoryExtensions.Sort(actual, StringComparer.CurrentCulture.Compare);
                break;

            case 2:
                MemoryExtensions.Sort(actual, (IComparer <object>)null);
                break;

            case 3:
                MemoryExtensions.Sort(actual, new byte[actual.Length].AsSpan());
                break;

            case 4:
                MemoryExtensions.Sort(actual, new byte[actual.Length].AsSpan(), StringComparer.CurrentCulture.Compare);
                break;

            case 5:
                MemoryExtensions.Sort(actual, new byte[actual.Length].AsSpan(), (IComparer <object>)null);
                break;
            }

            Assert.Equal(expected, actual.ToArray());
        }