Building on #76, this PR implements the interfaces and basic implementations of BooleanExpressions, bound and unbound predicates, and a series of wrapper functions for convenience. It also adds tests for these structs. Where possible, type safety is attempted by using generics to try to enforce types and to reduce the need for type switching in subsequent PRs.
Building on #76, this PR implements the interfaces and basic implementations of BooleanExpressions, bound and unbound predicates, and a series of wrapper functions for convenience. It also adds tests for these structs. Where possible, type safety is attempted by using generics to try to enforce types and to reduce the need for type switching in subsequent PRs.