This repository was archived by the owner on Nov 27, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrushiautil.go
81 lines (71 loc) · 1.7 KB
/
rushiautil.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package rushiautil
import (
"context"
"time"
)
// String returns a pointer string for SQL nullable.
func String(v string) *string {
return &v
}
// Bool returns a pointer boolean for SQL nullable.
func Bool(v bool) *bool {
return &v
}
// Int returns a pointer int for SQL nullable.
func Int(v int) *int {
return &v
}
// SliceInt returns a pointer slice of ints for SQL nullable.
func SliceInt(v []int) *[]int {
return &v
}
// SliceString returns a pointer string for SQL nullable.
func SliceString(v []string) *[]string {
return &v
}
// Float64 returns a pointer float64 for SQL nullable.
func Float64(v float64) *float64 {
return &v
}
// Time returns a pointer time.Time for SQL nullable.
func Time(v time.Time) *time.Time {
return &v
}
// ResolveContext
func ResolveContext[T any, M any](c context.Context, data []T, fetch func(T) string, keyer func(T, M) bool, swap func(T, M), solver func(context.Context, []string) ([]M, error)) error {
//
if len(data) == 0 {
return nil
}
//
ids := make([]string, len(data))
for i, v := range data {
id := fetch(v)
if id == "" {
continue
}
ids[i] = id
}
//
solved, err := solver(c, ids)
if err != nil {
return err
}
//
for _, v := range data {
for _, j := range solved {
if keyer(v, j) {
swap(v, j)
break
}
}
}
return nil
}
// Resolve
func Resolve[T any, M any](data []T, fetch func(T) string, keyer func(T, M) bool, swap func(T, M), solver func([]string) ([]M, error)) error {
newSovler := func(_ context.Context, ids []string) ([]M, error) {
return solver(ids)
}
return ResolveContext(context.Background(), data, fetch, keyer, swap, newSovler)
}