You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: merge.go
    path of file: ./repos/lakeFS/pkg/graveler/committed
    
    the code of the file until where you have to start completion: package committed

import (
	"bytes"
	"context"
	"fmt"

	"github.com/treeverse/lakefs/pkg/graveler"
	"github.com/treeverse/lakefs/pkg/logging"
)

type merger struct {
	ctx    context.Context
	logger logging.Logger

	writer               MetaRangeWriter
	base                 Iterator
	source               Iterator
	dest                 Iterator
	haveSource, haveDest bool
	strategy             graveler.MergeStrategy
}

// getNextGEKey moves base iterator from its current position to the next greater equal value
func (m *merger) getNextGEKey(key graveler.Key) (*graveler.ValueRecord, error) {
	baseValue, _ := m.base.Value()
	if base
    
func (m *merger) getNextGEKey(key graveler.Key) (*graveler.ValueRecord, error) {
	baseValue, _ := m.base.Value()
	if baseValue != nil && bytes.Compare(key, baseValue.Key) <= 0 {
		return baseValue, nil
	}

	for {
		_, baseRange := m.base.Value()
		if baseRange != nil && bytes.Compare(baseRange.MaxKey, key) >= 0 {
			for {
				baseValue, innerRange := m.base.Value()
				if baseValue != nil && bytes.Compare(key, baseValue.Key) <= 0 {
					return baseValue, nil
				}
				if !m.base.Next() || innerRange.ID != baseRange.ID {
					break
				}
			}
		} else if !m.base.NextRange() {
			break
		}
	}
	if err := m.base.Err(); err != nil {
		return nil, err
	}
	return nil, nil
}