Documentation
¶
Overview ¶
Package cowmaps defines various copy-on-write functions useful with maps of any type.
Example ¶
package main
import (
"fmt"
"github.com/phelmkamp/immut/cowmaps"
"github.com/phelmkamp/immut/romaps"
)
func main() {
m1 := map[string]int{"fiz": 3}
m2 := cowmaps.CopyOnWrite(m1)
cowmaps.Copy(&m2, romaps.Freeze(map[string]int{"foo": 42, "bar": 7}))
fmt.Println(m2)
fmt.Println(m1)
}
Output: map[bar:7 fiz:3 foo:42] map[fiz:3]
Example (Concurrent) ¶
Example_concurrent demonstrates that two concurrent goroutines can access the same map without the use of channels or locks.
package main
import (
"fmt"
"math/rand"
"strconv"
"time"
"github.com/phelmkamp/immut/cowmaps"
"github.com/phelmkamp/immut/romaps"
)
func makeMap(n int) map[string]*int {
rand.Seed(42)
m := make(map[string]*int, n)
for i := 0; i < n; i++ {
v := rand.Intn(n)
m[strconv.Itoa(v)] = &v
}
return m
}
func main() {
m := cowmaps.CopyOnWrite(makeMap(5_000))
go func() {
for {
// delete 1 pair after slight delay
time.Sleep(1 * time.Millisecond)
kDel := romaps.Keys(m.RO)[0]
cowmaps.DeleteFunc(&m, func(k string, v *int) bool {
return k == kDel
})
}
}()
go func() {
for {
// read all pairs constantly
// without COW panic is possible
// but ro is guaranteed not to change
ro := m.RO
for _, k := range romaps.Keys(ro) {
v, _ := ro.Index(k)
_ = fmt.Sprint(*v)
}
}
}()
// run for 1 sec
time.Sleep(1 * time.Second)
}
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Clear ¶
func Clear[K comparable, V any](m *Map[K, V])
Clear removes all entries from m, leaving it empty. Note: The underlying map is reallocated before the write-operation is performed.
func Copy ¶
func Copy[K comparable, V any](dst *Map[K, V], src romaps.Map[K, V])
Copy copies all key/value pairs in src adding them to dst. When a key in src is already present in dst, the value in dst will be overwritten by the value associated with the key in src. Note: The underlying map is cloned before the write-operation is performed.
func DeleteFunc ¶
func DeleteFunc[K comparable, V any](m *Map[K, V], del func(K, V) bool)
DeleteFunc deletes any key/value pairs from m for which del returns true. Note: The underlying map is cloned before the write-operation is performed.
func DoAll ¶
func DoAll[K comparable, V any](m *Map[K, V], cap int, ops ...Doer[K, V])
DoAll does all the supplied operations on the map with minimal reallocation. The initial capacity of the reallocated map is cap (or len(m) if cap is not sufficient). Note: The underlying map is cloned before the write-operations are performed.
Example ¶
package main
import (
"fmt"
"github.com/phelmkamp/immut/cowmaps"
)
func main() {
m := cowmaps.CopyOnWrite(map[string]int{"foo": 1})
cowmaps.DoAll(&m, m.RO.Len(),
cowmaps.DoCopy(map[string]int{"bar": 2, "baz": 3}), // map[foo:1 bar:2 baz:3]
cowmaps.DoDeleteFunc[string, int](func(_ string, v int) bool { return v == 2 }), // map[foo:1 baz:3]
cowmaps.DoSetIndex("baz", 2), // map[foo:1 baz:2]
cowmaps.DoDelete[string, int]("foo"), // map[baz:2]
)
fmt.Println(m)
}
Output: map[baz:2]
Types ¶
type Doer ¶
type Doer[K comparable, V any] interface { // contains filtered or unexported methods }
Doer defines a method for doing an operation on a map.
func DoCopy ¶
func DoCopy[K comparable, V any](src map[K]V) Doer[K, V]
DoCopy returns the maps.Copy operation.
func DoDelete ¶
func DoDelete[K comparable, V any](k K) Doer[K, V]
DoDelete returns the delete operation.
func DoDeleteFunc ¶
func DoDeleteFunc[K comparable, V any](del func(K, V) bool) Doer[K, V]
DoDeleteFunc returns the maps.DeleteFunc operation.
func DoSetIndex ¶
func DoSetIndex[K comparable, V any](k K, v V) Doer[K, V]
DoSetIndex returns the set index operation.
type Map ¶
type Map[K comparable, V any] struct { RO romaps.Map[K, V] // wraps a read-only map }
Map wraps a copy-on-write map.
func CopyOnWrite ¶
func CopyOnWrite[K comparable, V any](m map[K]V) Map[K, V]
CopyOnWrite returns a copy-on-write wrapper for the given map.
func (*Map[K, V]) Delete ¶
Delete deletes the element with the specified key from the map. If there is no such element, delete is a no-op. Note: The underlying map is reallocated before the write-operation is performed.