aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/util/util.go
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2025-06-19 01:22:19 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2025-06-19 01:22:19 -0400
commit21d72b2f67fb065d9071907c5c3307434aad3795 (patch)
tree9313ca1091d0f4c9b3252639d33b582c58f72d87 /pkg/util/util.go
parent649bbdf8d3fdda4423f2f30bbf98698e8f2faa07 (diff)
Add multiple clause and tree level optimizations
Implement optimizations that can be called in parallel or serial. Optimizations occur mostly in place and result in a logically equivalent tree when used correctly. Optimizations ============= * Sort - sort all statements within a clause tree * Simplify - apply negation rules to all statements * Flatten - merge child clauses with parents * Compact - merge equivalent statements * Tidy^ - remove zero statements * Contradictions - zero contradicting statements and clauses * StrictEquality - zero fuzzy statements when exact statements are within clause * Tighten - combine multiple fuzzy statements to the least (AND) or most (OR) restrictive bounds ^: when used incorrectly can turn an invalid clause tree into a valid one
Diffstat (limited to 'pkg/util/util.go')
-rw-r--r--pkg/util/util.go44
1 files changed, 43 insertions, 1 deletions
diff --git a/pkg/util/util.go b/pkg/util/util.go
index a1dc37c..a525bca 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -1,6 +1,10 @@
package util
-import "time"
+import (
+ "iter"
+ "slices"
+ "time"
+)
func ParseDateTime(s string) (time.Time, error) {
dateFormats := []string{
@@ -33,3 +37,41 @@ func ParseDateTime(s string) (time.Time, error) {
return time.Time{}, err
}
+
+// Create a copy of a slice with all values that satisfy cond
+func Fitler[E any](s []E, cond func(e E) bool) []E {
+ filtered := make([]E, 0, len(s))
+ for _, e := range s {
+ if cond(e) {
+ filtered = append(filtered, e)
+ }
+ }
+
+ return filtered
+}
+
+// Create an iterator of index and element for all values in a slice which satisfy cond.
+func FilterIter[E any](s []E, cond func(e E) bool) iter.Seq2[int, E] {
+ return func(yield func(int, E) bool) {
+ for i, e := range s {
+ if cond(e) {
+ if !yield(i, e) {
+ return
+ }
+ }
+ }
+ }
+}
+
+// FilterIter but backwards
+func BackwardsFilterIter[E any](s []E, cond func(e E) bool) iter.Seq2[int, E] {
+ return func(yield func(int, E) bool) {
+ for i := len(s) - 1; i >= 0; i-- {
+ if cond(s[i]) {
+ if !yield(i, s[i]) {
+ return
+ }
+ }
+ }
+ }
+}