public IEnumerable <JGram.Entry> Lookup(string key)
        {
            int limit = 50;

            var(start, end) = index.EqualRange(key, kvp => kvp.Key);
            var outOfBoundLimit = (limit - (end - start)) / 2;

            start = Math.Max(0, start - outOfBoundLimit);
            end   = Math.Min(entries.Count, end + outOfBoundLimit);
            var mid = (start + end) / 2;

            var resultEntries = EnumerableExt.Range(start, end - start)
                                .OrderBy(i => Math.Abs(i - mid))
                                .Select(i => index[i])
                                .Select(indexEntry =>
            {
                var indexKey   = indexEntry.Key;
                var entryKey   = indexEntry.Value;
                var(entry, id) = entries.BinarySearch(entryKey, e => e.Id);
                return((indexKey, entry).SomeWhen(_ => id != -1));
            })
                                .Values()
                                .OrderByDescending(r => CommonPrefixLength(r.indexKey, key))
                                .Where(r => CommonPrefixLength(r.indexKey, key) != 0)
                                .Select(r => r.entry);

            return(EnumerableExt.DistinctBy(resultEntries, entry => entry.Id));
        }