4.7 KiB
4.7 KiB
extypes
extypes - это небольшой Go-пакет с generic-коллекциями и вспомогательными методами поверх обычных slice и map.
В пакет входят:
Slice[T]: методы для срезов, напримерPush,Pop,Remove,Filter,MapTuple[T]: упорядоченная read-oriented коллекция с поддержкой JSONSet[T]: коллекция с уникальными значениями на базе срезаHashMap[K, V]: generic-обертка надmapQueue[T]: ограниченная по размеру FIFO-очередь с mutex-защитой
Требования
- Go
1.25+
Установка
go get git.nix13.pw/scuroneko/extypes
Импорт
import "git.nix13.pw/scuroneko/extypes"
Особенности дизайна
- Пакет остается близким к встроенным типам Go и не строит тяжелую абстракцию поверх них.
- Методы
Slice,SetиHashMapчасто возвращают receiver, чтобы было удобно писать chain-вызовы. - Часть методов мутирует данные на месте:
Slice.Map,Slice.Swap,Set.Map,Set.Swap,HashMap.Add,HashMap.Remove,HashMap.Map. Tupleориентирован на чтение, ноNewTupleFromне копирует входной срез, а оборачивает его.Setсохраняет порядок первого появления элементов. МетодEqualчувствителен к порядку.Set.Mapне восстанавливает уникальность, если функция отображения порождает дубликаты.- Порядок обхода
HashMapне определен, поэтомуKeys,Values,Items,IndexKeyиIndexValueне подходят там, где нужен стабильный порядок. - Для поиска и сравнения в
Slice,Tuple,SetиHashMap.IndexValueиспользуетсяreflect.DeepEqual, поэтому элементы не обязаны бытьcomparable.
Быстрые примеры
Slice
nums := extypes.NewSliceFrom([]int{1, 2, 3})
nums = nums.Push(4)
nums = nums.Remove(2)
nums = nums.Map(func(v int) int { return v * 10 })
fmt.Println(nums.ToArray()) // [10 30 40]
Tuple
tuple := extypes.NewTupleFrom([]string{"api", "worker", "cron"})
filtered := tuple.Filter(func(v string) bool {
return v != "worker"
})
fmt.Println(filtered.Join(", ")) // api, cron
Set
set := extypes.NewSetFrom([]string{"go", "go", "docs", "tests"})
set = set.Add("bench")
set = set.Remove("docs")
fmt.Println(set.ToArray()) // [go tests bench]
HashMap
ports := extypes.NewMapFrom(map[string]int{
"http": 80,
"https": 443,
})
ports.Add("ssh", 22)
secure := ports.Filter(func(name string, port int) bool {
return port >= 100 || name == "https"
})
fmt.Println(secure.Contains("https")) // true
Queue
q := extypes.CreateQueue[string](2)
_ = q.Enqueue("first")
_ = q.Enqueue("second")
head, _ := q.Peak()
fmt.Println(head) // first
item, _ := q.Dequeue()
fmt.Println(item) // first
Краткий обзор API
Slice[T]
Полезные методы:
Len,Cap,Get,First,LastIndex,EqualPush,Pop,Remove,SwapFilter,ForEach,Map,JoinToArray,ToAnyArray,ToSet,ToTuple
Tuple[T]
Полезные методы:
Len,Cap,GetEqualFilter,ForEach,JoinToArray,ToAnyArray,ToSet,ToSliceMarshalJSON,UnmarshalJSON
Set[T]
Полезные методы:
Len,Cap,Get,First,LastIndex,EqualAdd,Pop,Remove,SwapFilter,ForEach,Map,JoinToArray,ToAnyArray,ToSlice,ToTuple
HashMap[K, V]
Полезные методы:
Len,Get,GetOrDefault,ContainsAdd,RemoveKeys,Values,ItemsIndexKey,IndexValueFilter,ForEach,Map
Queue[T]
Полезные методы:
CreateQueueLen,Size,IsEmpty,IsFullEnqueue,Dequeue,PeakRaw
Возвращаемые ошибки:
QueueFullErrQueueEmptyErr
Запуск тестов
go test ./...
Godoc
Для публичного API добавлены doc-комментарии, поэтому локальную документацию можно смотреть стандартными инструментами Go:
go doc
go doc git.nix13.pw/scuroneko/extypes