From 301da04f9b394623b9e0c0d1a226c81d209c0823 Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Mon, 29 Nov 2021 02:03:53 +0000 Subject: [PATCH] what am i even doing --- merge/box.go | 2 +- ref/ref.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 ref/ref.go diff --git a/merge/box.go b/merge/box.go index 2fa44e1..633cd88 100644 --- a/merge/box.go +++ b/merge/box.go @@ -27,7 +27,7 @@ func strip[X any](f func(X) error) func(interface{}) error { return func(v interface{}) error { vv, ok := v.(X) if !ok { - return fmt.Errorf("unable to merge value of type %T into value of type %T: %w", v, vv, typeMismatch) + return fmt.Errorf("unexpected %T value, expected %T instead: %w", v, vv, typeMismatch) } return f(vv) } diff --git a/ref/ref.go b/ref/ref.go new file mode 100644 index 0000000..9aa11af --- /dev/null +++ b/ref/ref.go @@ -0,0 +1,22 @@ +package ref + +import ( + "fmt" +) + +// New creates a reference for a given pointer +func New[T any](v *T) Ref[T] { + if v == nil { + var zero T + return Ref[T]{ptr: &zero} + } + return Ref[T]{ptr: v} +} + +// Ref is a read reference to some value T +type Ref[T any] struct { ptr *T } + +// Val reads the value for this reference +func (r Ref[T]) Val() T { return *r.ptr } + +func (r Ref[T]) String() string { return fmt.Sprintf("ref{%s}", *r.ptr) }