simplify API of utils.Once

This commit is contained in:
Kovid Goyal
2023-05-26 22:42:07 +05:30
parent d89c1426d5
commit e59e42a6c2
17 changed files with 59 additions and 55 deletions

View File

@@ -11,10 +11,10 @@ var _ = fmt.Print
var hostname string = "*"
var Hostname = (&Once[string]{Run: func() string {
var Hostname = Once(func() string {
h, err := os.Hostname()
if err == nil {
return h
}
return ""
}}).Get
})

View File

@@ -264,9 +264,9 @@ func OpenNativeImageFromReader(f io.ReadSeeker) (ans *ImageData, err error) {
return
}
var MagickExe = (&utils.Once[string]{Run: func() string {
var MagickExe = utils.Once(func() string {
return utils.FindExe("magick")
}}).Get
})
func RunMagick(path string, cmd []string) ([]byte, error) {
if MagickExe() != "magick" {

View File

@@ -44,7 +44,7 @@ func load_mime_file(filename string, mime_map map[string]string) error {
return nil
}
var UserMimeMap = (&Once[map[string]string]{Run: func() map[string]string {
var UserMimeMap = Once(func() map[string]string {
conf_path := filepath.Join(ConfigDir(), "mime.types")
ans := make(map[string]string, 32)
err := load_mime_file(conf_path, ans)
@@ -52,7 +52,7 @@ var UserMimeMap = (&Once[map[string]string]{Run: func() map[string]string {
fmt.Fprintln(os.Stderr, "Failed to parse", conf_path, "for MIME types with error:", err)
}
return ans
}}).Get
})
func is_rcfile(path string) bool {
name := filepath.Base(path)

View File

@@ -10,7 +10,7 @@ import (
var _ = fmt.Print
type Once[T any] struct {
type once[T any] struct {
done uint32
mutex sync.Mutex
cached_val T
@@ -18,14 +18,14 @@ type Once[T any] struct {
Run func() T
}
func (self *Once[T]) Get() T {
func (self *once[T]) Get() T {
if atomic.LoadUint32(&self.done) == 0 {
self.do_slow()
}
return self.cached_val
}
func (self *Once[T]) do_slow() {
func (self *once[T]) do_slow() {
self.mutex.Lock()
defer self.mutex.Unlock()
if atomic.LoadUint32(&self.done) == 0 {
@@ -33,3 +33,7 @@ func (self *Once[T]) do_slow() {
self.cached_val = self.Run()
}
}
func Once[T any](f func() T) func() T {
return (&once[T]{Run: f}).Get
}

View File

@@ -11,10 +11,10 @@ var _ = fmt.Print
func TestOnce(t *testing.T) {
num := 0
var G = (&Once[string]{Run: func() string {
var G = Once(func() string {
num++
return fmt.Sprintf("%d", num)
}}).Get
})
G()
G()
G()

View File

@@ -62,7 +62,7 @@ func Abspath(path string) string {
return path
}
var KittyExe = (&Once[string]{Run: func() string {
var KittyExe = Once(func() string {
exe, err := os.Executable()
if err == nil {
ans := filepath.Join(filepath.Dir(exe), "kitty")
@@ -71,7 +71,7 @@ var KittyExe = (&Once[string]{Run: func() string {
}
}
return os.Getenv("KITTY_PATH_TO_KITTY_EXE")
}}).Get
})
func ConfigDirForName(name string) (config_dir string) {
if kcd := os.Getenv("KITTY_CONFIG_DIRECTORY"); kcd != "" {
@@ -117,11 +117,11 @@ func ConfigDirForName(name string) (config_dir string) {
return
}
var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
var ConfigDir = Once(func() (config_dir string) {
return ConfigDirForName("kitty.conf")
}}).Get
})
var CacheDir = (&Once[string]{Run: func() (cache_dir string) {
var CacheDir = Once(func() (cache_dir string) {
candidate := ""
if edir := os.Getenv("KITTY_CACHE_DIRECTORY"); edir != "" {
candidate = Abspath(Expanduser(edir))
@@ -136,7 +136,7 @@ var CacheDir = (&Once[string]{Run: func() (cache_dir string) {
}
os.MkdirAll(candidate, 0o755)
return candidate
}}).Get
})
func macos_user_cache_dir() string {
// Sadly Go does not provide confstr() so we use this hack.
@@ -176,7 +176,7 @@ func macos_user_cache_dir() string {
return ""
}
var RuntimeDir = (&Once[string]{Run: func() (runtime_dir string) {
var RuntimeDir = Once(func() (runtime_dir string) {
var candidate string
if q := os.Getenv("KITTY_RUNTIME_DIRECTORY"); q != "" {
candidate = q
@@ -199,7 +199,7 @@ var RuntimeDir = (&Once[string]{Run: func() (runtime_dir string) {
os.Chmod(candidate, 0o700)
}
return candidate
}}).Get
})
type Walk_callback func(path, abspath string, d fs.DirEntry, err error) error

View File

@@ -13,7 +13,7 @@ import (
var _ = fmt.Print
var DefaultExeSearchPaths = (&Once[[]string]{Run: func() []string {
var DefaultExeSearchPaths = Once(func() []string {
candidates := [...]string{"/usr/local/bin", "/opt/bin", "/opt/homebrew/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin"}
ans := make([]string, 0, len(candidates))
for _, x := range candidates {
@@ -22,7 +22,7 @@ var DefaultExeSearchPaths = (&Once[[]string]{Run: func() []string {
}
}
return ans
}}).Get
})
func Which(cmd string, paths ...string) string {
if strings.Contains(cmd, string(os.PathSeparator)) {