package db import "context" type semaphore chan struct{} func newSemaphore() semaphore { return make(semaphore, 1) } func (semaphore semaphore) With(ctx context.Context, cb func() error) error { select { case semaphore <- struct{}{}: case <-ctx.Done(): return ctx.Err() } defer func() { <-semaphore }() return cb() }