This commit is contained in:
Andrey Parhomenko 2023-07-21 19:00:09 +03:00
parent 5c01581006
commit 863da1e309
3 changed files with 23 additions and 19 deletions

View file

@ -12,12 +12,12 @@ func main() {
unord.Set(-4, "die")
unord.Set(-1000, "withme")
for v := range unord.Vals() {
fmt.Println(v.K, v.V)
for p := range unord.Chan() {
fmt.Println(p.K, p.V)
}
unord.Sort()
for v := range unord.Vals() {
fmt.Println(v.K, v.V)
for p := range unord.Chan() {
fmt.Println(p.K, p.V)
}
}

View file

@ -6,6 +6,7 @@ import (
// The package implements some more specific
// map structures for special uses.
// Implemented mostly to be embedded to other structures.
// General map type, wrap for the built-in one.
type Map[K comparable, V any] map[K] V

View file

@ -3,38 +3,38 @@ package sparsex
import (
"sort"
cons "golang.org/x/exp/constraints"
"github.com/mojosa-software/godat/src/iterx"
)
// The package implements a simple ordered map.
// In fact can be used as a sparse array so it is
// where the name comes from.
type Pair[K cons.Ordered, V any] struct {
K K
V V
}
// The sparse array type.
type Sparse[K cons.Ordered, V any] struct {
store map[K] V
keys []K
shouldSort bool
}
// Returns new sparse array
func New[K cons.Ordered, V any](s bool) *Sparse[K, V] {
// Returns new sparse array.
// If shouldSort == true then it will sort the array on
// each change.
func New[K cons.Ordered, V any](shouldSort bool) *Sparse[K, V] {
return &Sparse[K, V]{
store: make(map[K] V),
keys: []K{},
shouldSort: s,
shouldSort: shouldSort,
}
}
// Get the value by the key.
func (s *Sparse[K, V]) Get(key K) (V, bool) {
val, ok := s.store[key]
return val, ok
}
// Set the value to the key.
func (s *Sparse[K, V]) Set(k K, v V) {
_, ok := s.store[k]
if !ok {
@ -47,6 +47,7 @@ func (s *Sparse[K, V]) Set(k K, v V) {
s.store[k] = v
}
// Delete the value by the key.
func (s Sparse[K, V]) Del(k K) {
delete(s.store, k)
@ -68,16 +69,18 @@ func (s Sparse[K, V]) Del(k K) {
}
}
func (s *Sparse[K, V]) Vals(
) chan Pair[K, V] {
// Returns channel of pairs.
func (s *Sparse[K, V]) Chan(
) iterx.PairChan[K, V] {
keys := s.keys
store := s.store
ret := make(chan Pair[K, V])
ret := make(iterx.PairChan[K, V])
go func() {
for _, v := range keys {
ret <- Pair[K, V]{
v, store[v],
for _, k := range keys {
ret <- iterx.Pair[K, V]{
K: k,
V: store[k],
}
}
close(ret)