ultrago/reactive/notification.go

50 lines
781 B
Go
Raw Normal View History

2024-08-13 15:38:22 +00:00
package reactive
type NotificationKind int
const (
NextNotification NotificationKind = iota
ErrorNotification
)
type Notification[T any] interface {
Value() T
Error() error
Kind() NotificationKind
}
func MakeNext[T any](v T) Notification[T] {
return val[T]{v}
}
func MakeError[T any](e error) Notification[T] {
return err[T]{e}
}
type val[T any] struct {
value T
}
type err[T any] struct {
err error
}
func (v val[T]) Value() T {
return v.value
}
func (v val[T]) Error() error {
return nil
}
func (v val[T]) Kind() NotificationKind {
return NextNotification
}
func (e err[T]) Value() T {
panic("tried to .Value() on an Error notification")
}
func (e err[T]) Error() error {
return e.err
}
func (e err[T]) Kind() NotificationKind {
return ErrorNotification
}