internal static int CompiledBinarySearchWithClosure <T>(IList <T> source, T value, IComparer <T> comparer = null)
        {
            Closure2 <T> closure = new Closure2 <T>()
            {
                Source   = source,
                Value    = value,
                Comparer = comparer
            };

            return(CompiledLocalBinarySearch(0, source.Count - 1, ref closure));
        }
        private static int CompiledLocalBinarySearch <T>(int startIndex, int endIndex, ref Closure2 <T> closure)
        {
            if (startIndex > endIndex)
            {
                return(-1);
            }
            int middleIndex = startIndex + (endIndex - startIndex) / 2;
            int compare     = closure.Comparer.Compare(closure.Source[middleIndex], closure.Value);

            if (compare == 0)
            {
                return(middleIndex);
            }
            return(compare <= 0
                ? CompiledLocalBinarySearch(middleIndex + 1, endIndex, ref closure)
                : CompiledLocalBinarySearch(startIndex, middleIndex - 1, ref closure));
        }