aboutsummaryrefslogtreecommitdiff
path: root/core/operator/keyby.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/operator/keyby.go')
-rw-r--r--core/operator/keyby.go32
1 files changed, 32 insertions, 0 deletions
diff --git a/core/operator/keyby.go b/core/operator/keyby.go
new file mode 100644
index 0000000..56ef34e
--- /dev/null
+++ b/core/operator/keyby.go
@@ -0,0 +1,32 @@
1package operator
2
3import (
4 "context"
5 "flux/core"
6)
7
8type KeySelector[IN any] func(in IN) string
9type KeyByOperator[IN any] struct {
10 selector KeySelector[IN]
11}
12
13func NewKeyByOperator[IN any](selector KeySelector[IN]) *KeyByOperator[IN] {
14 return &KeyByOperator[IN]{selector: selector}
15}
16
17func (k *KeyByOperator[IN]) Open(ctx context.Context) error {
18 return nil
19}
20
21func (k *KeyByOperator[IN]) Process(ctx context.Context, record core.StreamRecord[IN], out Emitter[IN]) error {
22 if record.Type != core.RecordData {
23 return out.Emit(ctx, record)
24 }
25
26 record.Key = k.selector(record.Value)
27 return out.Emit(ctx, record)
28}
29
30func (k *KeyByOperator[IN]) Close(ctx context.Context) error {
31 return nil
32}