package puddle

import (
	"context"
	"time"
)

// valueCancelCtx combines two contexts into one. One context is used for values and the other is used for cancellation.
type valueCancelCtx struct {
	valueCtx  context.Context
	cancelCtx context.Context
}

func (ctx *valueCancelCtx) Deadline() (time.Time, bool) { return ctx.cancelCtx.Deadline() }
func (ctx *valueCancelCtx) Done() <-chan struct{}       { return ctx.cancelCtx.Done() }
func (ctx *valueCancelCtx) Err() error                  { return ctx.cancelCtx.Err() }
func (ctx *valueCancelCtx) Value(key any) any           { return ctx.valueCtx.Value(key) }

func newValueCancelCtx(valueCtx, cancelContext context.Context) context.Context {
	return &valueCancelCtx{
		valueCtx:  valueCtx,
		cancelCtx: cancelContext,
	}
}