def key_reduce(view, limit=2000, firstkey = nil, lastkey = nil, &block)
      
      startkey = firstkey
      
      keepgoing = true
      
      while keepgoing && viewrows = request_view(view, limit, startkey)
        startkey = viewrows.first['key']
        endkey = viewrows.last['key']
        if (startkey == endkey)
          
          
          viewrows = @db.view(view, :key => startkey)['rows']
          
          
          lastdocid = viewrows.last['id']
          fornextloop = @db.view(view, :startkey => startkey, :startkey_docid => lastdocid, :limit => 2)['rows']
          newendkey = fornextloop.last['key']
          if (newendkey == endkey)
            keepgoing = false
          else
            startkey = newendkey
          end
          rows = viewrows
        else
          rows = []
          for r in viewrows
            if (lastkey && r['key'] == lastkey)
              keepgoing = false
              break
            end
            break if (r['key'] == endkey)
            rows << r
          end   
          startkey = endkey
        end
        
        key = :begin
        values = []
        rows.each do |r|
          if key != r['key']
            
            yield(key, values) if key != :begin
            key = r['key']
            values = []
          end
          
          values << r['value']
        end
        yield(key, values)
      end
    end