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: perform.go
    path of file: ./repos/dendrite/roomserver/api
    
    the code of the file until where you have to start completion: package api

import (
	"crypto/ed25519"
	"encoding/json"
	"time"

	"github.com/matrix-org/dendrite/roomserver/types"
	"github.com/matrix-org/gomatrixserverlib"
	"github.com/matrix-org/gomatrixserverlib/spec"
)

type PerformCreateRoomRequest struct {
	InvitedUsers              []string
	RoomName                  string
	Visibility                string
	Topic                     string
	StatePreset               string
	Creati
    
func (r *PerformBackfillRequest) PrevEventIDs() []string {
	var uniqueIDs map[string]struct{}

	// Create a unique eventID map of either 100 or len(r.BackwardsExtremities).
	// 100 since Synapse/Dendrite stops after reaching 100 events.
	if len(r.BackwardsExtremities) > limitPrevEventIDs {
		uniqueIDs = make(map[string]struct{}, limitPrevEventIDs)
	} else {
		uniqueIDs = make(map[string]struct{}, len(r.BackwardsExtremities))
	}

outerLoop:
	for _, pes := range r.BackwardsExtremities {
		for _, evID := range pes {
			uniqueIDs[evID] = struct{}{}
			// We found enough unique eventIDs.
			if len(uniqueIDs) >= limitPrevEventIDs {
				break outerLoop
			}
		}
	}

	// map -> []string
	result := make([]string, len(uniqueIDs))
	i := 0
	for evID := range uniqueIDs {
		result[i] = evID
		i++
	}

	return result
}