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: gomega.go
    path of file: ./repos/devspace/vendor/github.com/onsi/gomega/internal
    
    the code of the file until where you have to start completion: package internal

import (
	"context"
	"time"

	"github.com/onsi/gomega/types"
)

type Gomega struct {
	Fail           types.GomegaFailHandler
	THelper        func()
	DurationBundle DurationBundle
}

func NewGomega(bundle DurationBundle) *Gomega {
	return &Gomega{
		Fail:           nil,
		THelper:        nil,
		DurationBundle: bundle,
	}
}

func (g *Gomega) IsConfigured() bool {
	return g.Fail != nil && g.THelper != nil
}

func (g *Gomega) ConfigureWithFailHandler(fail types.GomegaFailHandler) *Gomega {
	g.Fail = fail
	g.THelper = func() {}
	return g
}

func (g *Gomega) ConfigureWithT(t types.GomegaTestingT) *Gomega {
	g.Fail = func(message string, _ ...int) {
		t.Helper()
		t.Fatalf("\n%s", message)
	}
	g.THelper = t.Helper
	return g
}

func (g *Gomega) Î©(actual interface{}, extra ...interface{}) types.Assertion {
	return g.ExpectWithOffset(0
    
func (g *Gomega) makeAsyncAssertion(asyncAssertionType AsyncAssertionType, offset int, actualOrCtx interface{}, args ...interface{}) types.AsyncAssertion {
	baseOffset := 3
	timeoutInterval := -time.Duration(1)
	pollingInterval := -time.Duration(1)
	intervals := []interface{}{}
	var ctx context.Context

	actual := actualOrCtx
	startingIndex := 0
	if _, isCtx := actualOrCtx.(context.Context); isCtx && len(args) > 0 {
		// the first argument is a context, we should accept it as the context _only if_ it is **not** the only argumnent **and** the second argument is not a parseable duration
		// this is due to an unfortunate ambiguity in early version of Gomega in which multi-type durations are allowed after the actual
		if _, err := toDuration(args[0]); err != nil {
			ctx = actualOrCtx.(context.Context)
			actual = args[0]
			startingIndex = 1
		}
	}

	for _, arg := range args[startingIndex:] {
		switch v := arg.(type) {
		case context.Context:
			ctx = v
		default:
			intervals = append(intervals, arg)
		}
	}
	var err error
	if len(intervals) > 0 {
		timeoutInterval, err = toDuration(intervals[0])
		if err != nil {
			g.Fail(err.Error(), offset+baseOffset)
		}
	}
	if len(intervals) > 1 {
		pollingInterval, err = toDuration(intervals[1])
		if err != nil {
			g.Fail(err.Error(), offset+baseOffset)
		}
	}

	return NewAsyncAssertion(asyncAssertionType, actual, g, timeoutInterval, pollingInterval, 1, ctx, offset)
}