package monitor

import (
	"expvar"
	"strconv"
	"sync/atomic"
)

// Uint64 completes the expvar metric interface, holds an uint64 value.
type Uint64 struct {
	value uint64
}

// Set sets v to value.
func (v *Uint64) Set(value uint64) {
	atomic.StoreUint64(&v.value, value)
}

// Value returns the underline uint64 value.
func (v *Uint64) Value() uint64 {
	return atomic.LoadUint64(&v.value)
}

// String returns the text representation of the underline uint64 value.
func (v *Uint64) String() string {
	return strconv.FormatUint(atomic.LoadUint64(&v.value), 10)
}

func newUint64(name string) *Uint64 {
	v := new(Uint64)
	expvar.Publish(name, v)
	return v
}