package utils type TryChain[T any, V comparable] struct { result T error V success V } func NewTry[T any, V comparable](success V) *TryChain[T, V] { return &TryChain[T, V]{success: success} } func (c *TryChain[T, V]) Try(callback func() (T, V)) *TryChain[T, V] { c.result, c.error = callback() return c } func (c *TryChain[T, V]) Or(callback func() (T, V)) *TryChain[T, V] { if c.error == c.success { return c } return c.Try(callback) } func (c *TryChain[T, V]) Done() (T, V) { return c.result, c.error } type TryChainErr struct { err error } func NewTryErr() *TryChainErr { return &TryChainErr{} } func (c *TryChainErr) Try(callback func() error) *TryChainErr { c.err = callback() return c } func (c *TryChainErr) Or(callback func() error) *TryChainErr { if c.err == nil { return c } return c.Try(callback) } func (c *TryChainErr) Done() error { return c.err }