.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.1.1-0.20210319172145-bda8f5cee399 / internal / event / export / metric / exporter.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.1-0.20210319172145-bda8f5cee399/internal/event/export/metric/exporter.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.1-0.20210319172145-bda8f5cee399/internal/event/export/metric/exporter.go
new file mode 100644 (file)
index 0000000..4cafaa5
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package metric aggregates events into metrics that can be exported.
+package metric
+
+import (
+       "context"
+       "sync"
+       "time"
+
+       "golang.org/x/tools/internal/event"
+       "golang.org/x/tools/internal/event/core"
+       "golang.org/x/tools/internal/event/keys"
+       "golang.org/x/tools/internal/event/label"
+)
+
+var Entries = keys.New("metric_entries", "The set of metrics calculated for an event")
+
+type Config struct {
+       subscribers map[interface{}][]subscriber
+}
+
+type subscriber func(time.Time, label.Map, label.Label) Data
+
+func (e *Config) subscribe(key label.Key, s subscriber) {
+       if e.subscribers == nil {
+               e.subscribers = make(map[interface{}][]subscriber)
+       }
+       e.subscribers[key] = append(e.subscribers[key], s)
+}
+
+func (e *Config) Exporter(output event.Exporter) event.Exporter {
+       var mu sync.Mutex
+       return func(ctx context.Context, ev core.Event, lm label.Map) context.Context {
+               if !event.IsMetric(ev) {
+                       return output(ctx, ev, lm)
+               }
+               mu.Lock()
+               defer mu.Unlock()
+               var metrics []Data
+               for index := 0; ev.Valid(index); index++ {
+                       l := ev.Label(index)
+                       if !l.Valid() {
+                               continue
+                       }
+                       id := l.Key()
+                       if list := e.subscribers[id]; len(list) > 0 {
+                               for _, s := range list {
+                                       metrics = append(metrics, s(ev.At(), lm, l))
+                               }
+                       }
+               }
+               lm = label.MergeMaps(label.NewMap(Entries.Of(metrics)), lm)
+               return output(ctx, ev, lm)
+       }
+}