There are a lot of common operations simply missing from the Golang builtin library. This makes up for that deficiency. Here's a summary of some of the provided tools:
Here's a few additional operations for working with slices of bytes:
ContainsOnly(b, chars)
FromRange(a, z)
Reverse(b)
Indent(b, indent)
Handling deferred functions is a bit of a pain. This provides a way to handle certain deferred calls with a little less hassle:
Error
(allows capturing both errors that may occur during defer)
The built-in io/fs
package is fine for reading files, but is missing write interfaces. This provides them:
FileWriter
(analogous tofs.File
, but for writes)CreateFS
WriteFileFS
And then provides some additional general interfaces:
ReaderFS
ReaderWriterFS
WriterFS
And provides some convenience functions for working with them:
MkdirAll(fsys, name, perm)
WriteFile(fsys, name, data, perm)
The built-in comparable generic is pretty weak. Just good enough for map key
types, but not much else. We provide a compare.Able interface which covers all
the types that can be compared using <
, >
, <=
, and >=
operators, in
addition to ==
and !=
. Then we provide the following operations on them:
CountDeltas(a, b, delta)
Max(a, b)
Min(a, b)
Less(a, b)
Zero()
FirstNonZero(...vals)
FirstNonNil(...vals)
Then we create a generic interface for doing the same thing generally, which
looks similar to what the built-in sort
package does but then implements the
functions to make such an interface even more useful:
MaxI(a, b)
MinI(a, b)
LessI(a, b)
Iteration in Golang is provided by using a for
-loop with the range
keyword.
This has some deficiencies, however. This iterator cannot be passed around
in-progress. Also, when iterating over maps, the iterator is over key/value
pairs rather than index/value pairs. Sometimes it's also helpful to have that
index.
Many common slice operations are a bit tedious to implement. It's easy to get off-by-one errors, so the following ops are provided:
FromRange(a, z, delta)
Delete(slice, index)
DeleteValue(slice, value)
DeleteAllValues(slice, value)
Insert(slice, index, value)
Push(slice, value)
Pop(slice)
Shift(slice)
Unshift(slice, value)
Concat(slice...)
Map(slice, mapper)
MapSlice(slice, mapper)
MapMap(slice, mapper)
Reduce(slice, reducer)
Reductions(slice, reducer)
ReduceAcc(slice, start, reducer)
ReductionsAcc(slice, start, reducer)
Sum(slice)
Product(slice)
Grep(slice, predicate)
GrepIndex(slice, predicate)
Any(slice, predicate)
All(slice, predicate)
None(slice, predicate)
NotAll(slice, predicate)
First(slice, predicate)
FirstIndex(slice, predicate)
FirstOr(slice, missed, predicate)
Head(slice, n)
Tail(slice, n)
Shuffle(slice)
Sample(slice, n)
Uniq(slice)
UniqInPlace(slice)
Frequently, you need to get just the keys or values off of a slice. This provides those operations among others for maps:
Copy(dst, src)
CopyInit(dst, src)
Keys(map)
Values(map)
KVs(map)
There are a lot of common map operations that are missing from the built-in standard library:
Merge(...maps)
MergeInPlace(base, ...maps)
Diff(a, b)
There's no built-in set operation. This library provides one. It provides the following methods on sets:
Contains(val)
Insert(val)
Delete(val)
Len()
SubsetOf(set)
Keys()
And then it also provides these functions to work on sets:
Intersects(a, b)
Intersection(b, b)
Union(a, b)
Difference(a, b)
Copy(dst, src)
CopyInit(dst, src)
Diff(a, b)
Some additional string operations are provided that are missing from the
built-in strings
package:
ContainsOnly(s, chars)
FromRange(a, z)
Reverse(s)
Increment(s)
IncrementWithSets(s, sets)
Indent(s, indent)
The latter two operations might warrant their own library, but I put them here for now.