orderedmap

package module
v1.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 15, 2026 License: MIT Imports: 9 Imported by: 0

README

orderedmap

GitHub Tag Go Reference CI codecov Go Report Card

A generic, thread-safe ordered map for Go that preserves insertion order using container/list.

Installation

go get github.com/winebarrel/orderedmap

Requires Go 1.23+.

Usage

package main

import (
	"fmt"
	"slices"

	"github.com/winebarrel/orderedmap"
)

func main() {
	om := orderedmap.New[string, any]()

	om.Set("foo", "bar")
	om.Set("zoo", 100)
	om.Set("baz", true)

	fmt.Println(om)
	//=> *orderedmap.Map[string,interface {}][foo:bar zoo:100 baz:true]

	// Get a value
	fmt.Println(om.Get("foo"))
	//=> bar

	// Get a value with existence check
	v, ok := om.GetOk("foo")
	fmt.Println(v, ok)
	//=> bar true

	// Iterate over key-value pairs in insertion order
	for k, v := range om.All() {
		fmt.Println(k, v)
	}
	//=> foo bar
	//   zoo 100
	//   baz true

	// Iterate over keys
	for k := range om.Keys() {
		fmt.Println(k)
	}

	// Iterate over values
	for v := range om.Values() {
		fmt.Println(v)
	}

	// Push moves an existing key to the back
	om.Push("foo", "new_bar")
	for k, v := range om.All() {
		fmt.Println(k, v)
	}
	//=> zoo 100
	//   baz true
	//   foo new_bar

	// Get all key-value pairs as a slice
	pairs := om.Entries()
	fmt.Println(pairs)
	//=> [{zoo 100} {baz true} {foo new_bar}]

	// Delete a key
	om.Delete("zoo")

	// Get the number of entries
	fmt.Println(om.Len())
	//=> 2

	// Clear all entries
	om.Clear()

	// Create from an iterator
	om2 := orderedmap.From(slices.All([]string{"foo", "bar", "baz"}))
	fmt.Println(om2)
	//=> *orderedmap.Map[int,string][0:foo 1:bar 2:baz]
}

Transform

package main

import (
	"fmt"

	"github.com/winebarrel/orderedmap"
)

func main() {
	om := orderedmap.New[string, int]()
	om.Set("foo", 1)
	om.Set("bar", 2)
	om.Set("baz", 3)

	// Transform returns an iterator of transformed values
	for s := range orderedmap.Transform(om, func(k string, v int) string {
		return fmt.Sprintf("%s=%d", k, v)
	}) {
		fmt.Println(s)
	}
	//=> foo=1
	//   bar=2
	//   baz=3

	// TransformSlice returns a slice of transformed values
	ss := orderedmap.TransformSlice(om, func(k string, v int) string {
		return fmt.Sprintf("%s=%d", k, v)
	})
	fmt.Println(ss)
	//=> [foo=1 bar=2 baz=3]
}

JSON Marshal / Unmarshal

package main

import (
	"encoding/json"
	"fmt"

	"github.com/winebarrel/orderedmap"
)

func main() {
	// Marshal: preserves insertion order
	om := orderedmap.New[string, any]()
	om.Set("z", 3)
	om.Set("a", 1)
	om.Set("m", 2)

	b, _ := json.Marshal(om)
	fmt.Println(string(b))
	//=> {"z":3,"a":1,"m":2}

	// Unmarshal: preserves key order from JSON
	om2 := orderedmap.New[string, any]()
	json.Unmarshal([]byte(`{"z":3,"a":1,"m":2}`), om2)

	for k, v := range om2.All() {
		fmt.Println(k, v)
	}
	//=> z 3
	//   a 1
	//   m 2
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Transform added in v1.7.0

func Transform[K comparable, V any, R any](om *Map[K, V], f func(k K, v V) R) iter.Seq[R]

func TransformSlice added in v1.7.0

func TransformSlice[K comparable, V any, R any](om *Map[K, V], f func(k K, v V) R) []R

Types

type Map added in v1.1.0

type Map[K comparable, V any] struct {
	// contains filtered or unexported fields
}

func From added in v1.2.0

func From[K comparable, V any](seq iter.Seq2[K, V]) *Map[K, V]

func New

func New[K comparable, V any]() *Map[K, V]

func (*Map[K, V]) All added in v1.1.0

func (om *Map[K, V]) All() iter.Seq2[K, V]

func (*Map[K, V]) Clear added in v1.1.0

func (om *Map[K, V]) Clear()

func (*Map[K, V]) Clone added in v1.5.0

func (om *Map[K, V]) Clone() *Map[K, V]

func (*Map[K, V]) CollectKeys added in v1.6.0

func (om *Map[K, V]) CollectKeys() []K

func (*Map[K, V]) CollectValues added in v1.6.0

func (om *Map[K, V]) CollectValues() []V

func (*Map[K, V]) Delete added in v1.1.0

func (om *Map[K, V]) Delete(k K) V

func (*Map[K, V]) DeleteOk added in v1.1.0

func (om *Map[K, V]) DeleteOk(k K) (V, bool)

func (*Map[K, V]) Entries added in v1.3.0

func (om *Map[K, V]) Entries() []Pair[K, V]

func (*Map[K, V]) Get added in v1.1.0

func (om *Map[K, V]) Get(k K) V

func (*Map[K, V]) GetOk added in v1.1.0

func (om *Map[K, V]) GetOk(k K) (V, bool)

func (*Map[K, V]) Keys added in v1.1.0

func (om *Map[K, V]) Keys() iter.Seq[K]

func (*Map[K, V]) Len added in v1.1.0

func (om *Map[K, V]) Len() int

func (*Map[K, V]) MarshalJSON added in v1.4.0

func (om *Map[K, V]) MarshalJSON() ([]byte, error)

func (*Map[K, V]) Push added in v1.1.0

func (om *Map[K, V]) Push(k K, v V)

func (*Map[K, V]) Set added in v1.1.0

func (om *Map[K, V]) Set(k K, v V)

func (*Map[K, V]) String added in v1.1.0

func (om *Map[K, V]) String() string

func (*Map[K, V]) UnmarshalJSON added in v1.4.0

func (om *Map[K, V]) UnmarshalJSON(data []byte) error

func (*Map[K, V]) Values added in v1.1.0

func (om *Map[K, V]) Values() iter.Seq[V]

type Pair

type Pair[K comparable, V any] struct {
	Key   K
	Value V
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL