feat: dateutils, maputils, sliceutils.
This commit is contained in:
94
maputils/maputils.go
Normal file
94
maputils/maputils.go
Normal file
@@ -0,0 +1,94 @@
|
||||
// This package includes utility functions for handling and manipulating maputils.
|
||||
// It draws inspiration from JavaScript and Python and uses Go generics as a basis.
|
||||
|
||||
package maputils
|
||||
|
||||
// Keys - takes a map with keys K and values V, returns a slice of type K of the map's keys.
|
||||
// Note: Go maps do not preserve insertion order.
|
||||
func Keys[K comparable, V any](mapInstance map[K]V) []K {
|
||||
keys := make([]K, len(mapInstance))
|
||||
|
||||
i := 0
|
||||
for k := range mapInstance {
|
||||
keys[i] = k
|
||||
i++
|
||||
}
|
||||
|
||||
return keys
|
||||
}
|
||||
|
||||
// Values - takes a map with keys K and values V, returns a slice of type V of the map's values.
|
||||
// Note: Go maps do not preserve insertion order.
|
||||
func Values[K comparable, V any](mapInstance map[K]V) []V {
|
||||
values := make([]V, len(mapInstance))
|
||||
|
||||
i := 0
|
||||
for _, v := range mapInstance {
|
||||
values[i] = v
|
||||
i++
|
||||
}
|
||||
|
||||
return values
|
||||
}
|
||||
|
||||
// Merge - takes an arbitrary number of map instances with keys K and values V and merges them into a single map.
|
||||
// Note: merge works from left to right. If a key already exists in a previous map, its value is over-written.
|
||||
func Merge[K comparable, V any](mapInstances ...map[K]V) map[K]V {
|
||||
var mergedMapSize int
|
||||
|
||||
for _, mapInstance := range mapInstances {
|
||||
mergedMapSize += len(mapInstance)
|
||||
}
|
||||
|
||||
mergedMap := make(map[K]V, mergedMapSize)
|
||||
|
||||
for _, mapInstance := range mapInstances {
|
||||
for k, v := range mapInstance {
|
||||
mergedMap[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
return mergedMap
|
||||
}
|
||||
|
||||
// ForEach - given a map with keys K and values V, executes the passed in function for each key-value pair.
|
||||
func ForEach[K comparable, V any](mapInstance map[K]V, function func(key K, value V)) {
|
||||
for key, value := range mapInstance {
|
||||
function(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
// Drop - takes a map with keys K and values V, and a slice of keys K, dropping all the key-value pairs that match the keys in the slice.
|
||||
// Note: this function will modify the passed in map. To get a different object, use the Copy function to pass a copy to this function.
|
||||
func Drop[K comparable, V any](mapInstance map[K]V, keys []K) map[K]V {
|
||||
for _, key := range keys {
|
||||
delete(mapInstance, key)
|
||||
}
|
||||
|
||||
return mapInstance
|
||||
}
|
||||
|
||||
// Copy - takes a map with keys K and values V and returns a copy of the map.
|
||||
func Copy[K comparable, V any](mapInstance map[K]V) map[K]V {
|
||||
mapCopy := make(map[K]V, len(mapInstance))
|
||||
|
||||
for key, value := range mapInstance {
|
||||
mapCopy[key] = value
|
||||
}
|
||||
|
||||
return mapCopy
|
||||
}
|
||||
|
||||
// Filter - takes a map with keys K and values V, and executes the passed in function for each key-value pair.
|
||||
// If the filter function returns true, the key-value pair will be included in the output, otherwise it is filtered out.
|
||||
func Filter[K comparable, V any](mapInstance map[K]V, function func(key K, value V) bool) map[K]V {
|
||||
mapCopy := make(map[K]V, len(mapInstance))
|
||||
|
||||
for key, value := range mapInstance {
|
||||
if function(key, value) {
|
||||
mapCopy[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
return mapCopy
|
||||
}
|
||||
Reference in New Issue
Block a user