Functional Programming tools in Golang that use Go 1.18 Generics
General Purpose tools for Functional Programming
Generic set operations on Golang arrays: Filtering, Union, Intersection, Minus
Generic Linked List
Generic function composition
Generic sort
Generic function currying and partial application
Type-Checked Properties-based testing that is based upon ScalaCheck and Haskell Quickcheck
Everything has strong typing thanks to Golang Generics
Many kinds of test data generators
Every generator is composable. Lots of generators are included already and new ones are easy to make as compositions of existing generators.
A property is composable with other properties
Assertions are composable with And and Or logic
Test Failures include the specific generated values that caused test failure as well as the last successful case.
Programmers can better cover the scope of all possible inputs to a test (i.e. zero values, empty things, etc).
Tests outcomes are reproducible
Programmers can eliminate a lot of code duplication and get better tests at the same time because properties-based testing uses random test data.
Properties-based testing is useful for all sorts of tests: unit, integration, course-grained functional/system/black-box.
A few properties-based testing library exist in Golang. Gopter is an example. This library has much less code than Gopter and provides a very important feature that Gopter does not, namely that all abstractions are fully composable.
Two Key Abstractions
Generators - Generators are functions that produce random test data.
They are composable. You can combine them to make other generators.
They obey algebraic laws. You can guarantee the safety of their compositions.
They are pure functions, freely shareable between Go Routines.
Generators allow you to reproduce the exact same test data by passing in the same integer seed value into a SimpleRNG. You should never need to save files of test data again.
Properties - Properties are functions that execute a predicate-like function over a set of test data generated using a given Generator.
They are composable - You can combine them in arbitrary ways to make new properties.
They obey algebraic laws so that you can guarantee the safety of their compositions.
They are pure functions, freely shareable between Go Routines.
A property is a function that takes two function arguments:
one transforming a generated value into a potentially different type
and one evaluating the preceding value for correctness.
These two characteristics are a very important feature for test reuse.