Initial commit
This commit is contained in:
39
container/memo.go
Normal file
39
container/memo.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package ucontainer
|
||||
|
||||
// Memo holds a cached value.
|
||||
type Memo[T any] struct {
|
||||
cache T
|
||||
valid bool
|
||||
update func () T
|
||||
}
|
||||
|
||||
// NewMemo creates a new Memo which will take its value from the specified
|
||||
// update callback.
|
||||
func NewMemo[T any] (update func () T) Memo[T] {
|
||||
return Memo[T] {
|
||||
update: update,
|
||||
}
|
||||
}
|
||||
|
||||
// Value returns the Memo's value, updating it if the current cached value is
|
||||
// invalid.
|
||||
func (this *Memo[T]) Value () T {
|
||||
if !this.valid {
|
||||
this.cache = this.update()
|
||||
}
|
||||
return this.cache
|
||||
}
|
||||
|
||||
// Invalidate marks the Memo's value as invalid, which will cause it to be
|
||||
// updated the next time Value is called.
|
||||
func (this *Memo[T]) Invalidate () {
|
||||
this.valid = false
|
||||
}
|
||||
|
||||
// InvalidateTo invalidates the Memo and sets its value. The new value will be
|
||||
// entirely inaccessible. This is only intended to be used for setting a
|
||||
// reference to nil
|
||||
func (this *Memo[T]) InvalidateTo (value T) {
|
||||
this.Invalidate()
|
||||
this.cache = value
|
||||
}
|
||||
33
container/set.go
Normal file
33
container/set.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package ucontainer
|
||||
|
||||
// Set is a set of unique items, built on top of map.
|
||||
type Set[T comparable] map[T] struct { }
|
||||
|
||||
// Empty returns true if there are no items in the set.
|
||||
func (set Set[T]) Empty () bool {
|
||||
return set == nil || len(set) == 0
|
||||
}
|
||||
|
||||
// Has returns true if the set contains item.
|
||||
func (set Set[T]) Has (item T) bool {
|
||||
if set == nil {
|
||||
return false
|
||||
}
|
||||
_, ok := set[item]
|
||||
return ok
|
||||
}
|
||||
|
||||
// Add adds an item to the set.
|
||||
func (set Set[T]) Add (item T) {
|
||||
set[item] = struct { } { }
|
||||
}
|
||||
|
||||
// Pop removes the first accessible item from the set and returns it.
|
||||
func (set Set[T]) Pop () (item T) {
|
||||
for item := range set {
|
||||
delete(set, item)
|
||||
return item
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user