This is an automated email from the ASF dual-hosted git repository.

zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new 98ee2306 [operator] Add Lazy complete
98ee2306 is described below

commit 98ee230613e0d5ff7c660372d4e09f24ccf99add
Author: mfordjody <[email protected]>
AuthorDate: Sun Dec 8 12:37:49 2024 +0800

    [operator] Add Lazy complete
---
 pkg/laziness/laziness.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/pkg/laziness/laziness.go b/pkg/laziness/laziness.go
new file mode 100644
index 00000000..0a65e5d3
--- /dev/null
+++ b/pkg/laziness/laziness.go
@@ -0,0 +1,58 @@
+package laziness
+
+import (
+       "sync"
+       "sync/atomic"
+)
+
+type lazinessImpl[T any] struct {
+       getter func() (T, error)
+       retry  bool
+       res    T
+       err    error
+       done   uint32
+       m      sync.Mutex
+}
+
+type Laziness[T any] interface {
+       Get() (T, error)
+}
+
+var _ Laziness[any] = &lazinessImpl[any]{}
+
+func New[T any](f func() (T, error)) Laziness[T] {
+       return &lazinessImpl[T]{
+               getter: f,
+       }
+}
+
+func NewWithRetry[T any](f func() (T, error)) Laziness[T] {
+       return &lazinessImpl[T]{
+               getter: f,
+               retry:  true,
+       }
+}
+
+func (l *lazinessImpl[T]) Get() (T, error) {
+       if atomic.LoadUint32(&l.done) == 0 {
+       }
+}
+
+func (l *lazinessImpl[T]) doSlow() (T, error) {
+       l.m.Lock()
+       defer l.m.Unlock()
+       if l.done == 0 {
+               done := uint32(1)
+               defer func() {
+                       atomic.StoreInt32(&l.done, done)
+               }()
+               res, err := l.getter()
+               if l.retry && err != nil {
+                       done = 0
+               } else {
+                       l.res, l.err = res, err
+               }
+               return res, err
+       }
+       return l.res, l.err
+}

Reply via email to