bvbej 2 年 前
コミット
d83a2a1508
1 ファイル変更57 行追加0 行削除
  1. 57 0
      pkg/ticker/ticker.go

+ 57 - 0
pkg/ticker/ticker.go

@@ -0,0 +1,57 @@
+package ticker
+
+import (
+	"context"
+	"fmt"
+	"time"
+)
+
+var _ Ticker = (*ticker)(nil)
+
+type Ticker interface {
+	worker()
+}
+
+type ticker struct {
+	ticker *time.Ticker
+	ctx    context.Context
+	cancel context.CancelFunc
+	f      func()
+}
+
+func New(d time.Duration) Ticker {
+	ctx, cancelFunc := context.WithCancel(context.Background())
+	return &ticker{
+		ticker: time.NewTicker(d),
+		ctx:    ctx,
+		cancel: cancelFunc,
+	}
+}
+
+func (t *ticker) worker() {
+	for {
+		select {
+		case <-t.ticker.C:
+			t.f()
+		case <-t.ctx.Done():
+			return
+		}
+	}
+}
+
+func (t *ticker) Process(fun any) error {
+	f, ok := fun.(func())
+	if !ok {
+		return fmt.Errorf("fun is not func")
+	}
+	t.f = f
+
+	go t.worker()
+
+	return nil
+}
+
+func (t *ticker) Stop() {
+	t.ticker.Stop()
+	t.cancel()
+}