Implemented basic sparse array.
This commit is contained in:
parent
28536eb2e0
commit
eddf2c345c
4 changed files with 122 additions and 0 deletions
2
go.mod
2
go.mod
|
@ -1,3 +1,5 @@
|
|||
module github.com/surdeus/godat
|
||||
|
||||
go 1.19
|
||||
|
||||
require golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect
|
||||
|
|
2
go.sum
Normal file
2
go.sum
Normal file
|
@ -0,0 +1,2 @@
|
|||
golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w=
|
||||
golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
23
src/cmd/sparse/main.go
Normal file
23
src/cmd/sparse/main.go
Normal file
|
@ -0,0 +1,23 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/surdeus/godat/src/sparsex"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
unord := sparsex.New[int, string](true)
|
||||
unord.Set(1, "suck")
|
||||
unord.Set(-5, "cock")
|
||||
unord.Set(-4, "die")
|
||||
unord.Set(-1000, "withme")
|
||||
|
||||
for v := range unord.Vals() {
|
||||
fmt.Println(v.K, v.V)
|
||||
}
|
||||
|
||||
unord.Sort()
|
||||
for v := range unord.Vals() {
|
||||
fmt.Println(v.K, v.V)
|
||||
}
|
||||
}
|
95
src/sparsex/main.go
Normal file
95
src/sparsex/main.go
Normal file
|
@ -0,0 +1,95 @@
|
|||
package sparsex
|
||||
|
||||
import (
|
||||
"sort"
|
||||
cons "golang.org/x/exp/constraints"
|
||||
)
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
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] {
|
||||
return &Sparse[K, V]{
|
||||
store: make(map[K] V),
|
||||
keys: []K{},
|
||||
shouldSort: s,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func (s *Sparse[K, V]) Get(key K) (V, bool) {
|
||||
val, ok := s.store[key]
|
||||
return val, ok
|
||||
}
|
||||
|
||||
func (s *Sparse[K, V]) Set(k K, v V) {
|
||||
_, ok := s.store[k]
|
||||
if !ok {
|
||||
s.keys = append(s.keys, k)
|
||||
if s.shouldSort {
|
||||
s.Sort()
|
||||
}
|
||||
}
|
||||
|
||||
s.store[k] = v
|
||||
}
|
||||
|
||||
func (s Sparse[K, V]) Del(k K) {
|
||||
delete(s.store, k)
|
||||
|
||||
// To know if the loop was run.
|
||||
idx := -1
|
||||
|
||||
for i, v := range s.keys {
|
||||
if v == k {
|
||||
idx = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if idx != -1 {
|
||||
s.keys = append(s.keys[:idx], s.keys[idx+1:]...)
|
||||
if s.shouldSort {
|
||||
s.Sort()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Sparse[K, V]) Vals(
|
||||
) chan Pair[K, V] {
|
||||
keys := s.keys
|
||||
store := s.store
|
||||
ret := make(chan Pair[K, V])
|
||||
|
||||
go func() {
|
||||
for _, v := range keys {
|
||||
ret <- Pair[K, V]{
|
||||
v, store[v],
|
||||
}
|
||||
}
|
||||
close(ret)
|
||||
}()
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// Sort the keys.
|
||||
func (s *Sparse[K, V]) Sort() {
|
||||
sort.Slice(s.keys, func(i, j int) bool {
|
||||
return s.keys[i] < s.keys[j]
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in a new issue