public K advise( Set<K> currentSet, long position )
    {
        K advice = null; // current candidate to return
        long max = Long.MIN_VALUE; // advice's position - max encountered
        for ( K inMem : currentSet )
        {
            if ( evicted.contains( inMem ) )
            {
                continue;
            }
            List<Long> current = distances.get( inMem );
            if ( current == null )
            {
                // not met again, safe to remove
                advice = inMem;
                System.err.println( "Not met" );
                break;
            }
            while ( current.size() > 0 && current.get( 0 ) < position )
            {
                current.remove( 0 );
            }
            if ( current.size() == 0 )
            {
                // Already skipped, weird but nevertheless
                System.out.println( inMem + " was already skipped at position "
                                    + position );
                distances.remove( inMem );
                advice = inMem;
                break;
            }
            long closestForCurrent = current.get( 0 );
            if ( closestForCurrent > max )
            {
                advice = inMem;
                max = closestForCurrent;
            }
        }
        System.out.println( "Suggested for eviction " + advice
                            + " that is at "
                            + max + " with current position being " + position );
        return advice;
    }