Skip to content

Commit 1dcf4ec

Browse files
authored
feat: Add samber/lo for functional collection utilities (#191)
* feat: Add samber/lo for functional collection utilities Add samber/lo v1.52.0 which provides type-safe generic collection operations including Map, Filter, Reduce, GroupBy, Find, and more. This complements samber/mo (PR #189) which provides monadic types: - samber/mo: Option, Result, Either, Future, IO - samber/lo: Map, Filter, Reduce, GroupBy, Flatten, etc. Together they provide a complete functional programming toolkit for Go with compile-time type safety via generics. * refactor: Use samber/lo for collection operations Apply samber/lo to improve code clarity and type safety: - payment-order/service: Use lo.Map for PaymentOrder slice transformation - position-keeping/repository: Use lo.Filter for audit entry filtering - platform/observability: Use lo.Keys for metadata carrier keys These changes demonstrate the practical value of the samber/lo library by replacing manual loops with expressive, type-safe functional operations. * style: Fix import formatting --------- Co-authored-by: Ben Coombs <[email protected]>
1 parent f4b424e commit 1dcf4ec

File tree

5 files changed

+14
-18
lines changed

5 files changed

+14
-18
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ require (
4242
github.com/prometheus/client_model v0.6.2 // indirect
4343
github.com/prometheus/common v0.66.1 // indirect
4444
github.com/prometheus/procfs v0.16.1 // indirect
45+
github.com/samber/lo v1.52.0 // indirect
4546
github.com/spf13/pflag v1.0.10 // indirect
4647
github.com/stretchr/objx v0.5.2 // indirect
4748
go.yaml.in/yaml/v2 v2.4.2 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7
12551255
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
12561256
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
12571257
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
1258+
github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw=
1259+
github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
12581260
github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE=
12591261
github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs=
12601262
github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU=

internal/payment-order/service/grpc_service.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/meridianhub/meridian/internal/payment-order/domain"
2222
poobservability "github.com/meridianhub/meridian/internal/payment-order/observability"
2323
"github.com/meridianhub/meridian/internal/platform/observability"
24+
"github.com/samber/lo"
2425
"google.golang.org/genproto/googleapis/type/money"
2526
"google.golang.org/grpc/codes"
2627
"google.golang.org/grpc/status"
@@ -1091,14 +1092,10 @@ func (s *Service) ListPaymentOrders(ctx context.Context, req *pb.ListPaymentOrde
10911092
return nil, status.Error(codes.Internal, "failed to list payment orders")
10921093
}
10931094

1094-
// Convert to proto
1095-
protoOrders := make([]*pb.PaymentOrder, 0, len(result.PaymentOrders))
1096-
for _, po := range result.PaymentOrders {
1097-
protoOrders = append(protoOrders, toProto(po))
1098-
}
1099-
11001095
return &pb.ListPaymentOrdersResponse{
1101-
PaymentOrders: protoOrders,
1096+
PaymentOrders: lo.Map(result.PaymentOrders, func(po *domain.PaymentOrder, _ int) *pb.PaymentOrder {
1097+
return toProto(po)
1098+
}),
11021099
Pagination: &commonpb.PaginationResponse{
11031100
NextPageToken: result.NextCursor,
11041101
TotalCount: result.TotalCount,

internal/platform/observability/grpc.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99
"sync"
1010

11+
"github.com/samber/lo"
1112
"go.opentelemetry.io/otel/attribute"
1213
"go.opentelemetry.io/otel/codes"
1314
"go.opentelemetry.io/otel/propagation"
@@ -459,9 +460,5 @@ func (mc metadataCarrier) Set(key string, value string) {
459460

460461
// Keys lists the keys stored in this carrier.
461462
func (mc metadataCarrier) Keys() []string {
462-
keys := make([]string, 0, len(mc))
463-
for k := range mc {
464-
keys = append(keys, k)
465-
}
466-
return keys
463+
return lo.Keys(mc)
467464
}

internal/position-keeping/repository/postgres_repository.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/jackc/pgx/v5/pgconn"
1515
"github.com/jackc/pgx/v5/pgxpool"
1616
"github.com/meridianhub/meridian/internal/position-keeping/domain"
17+
"github.com/samber/lo"
1718
"github.com/shopspring/decimal"
1819
)
1920

@@ -357,12 +358,10 @@ func (r *PostgresRepository) Update(ctx context.Context, log *domain.FinancialPo
357358
}
358359

359360
// Filter for only new audit entries
360-
newAuditEntries := make([]*domain.AuditTrailEntry, 0)
361-
for _, entry := range log.AuditTrail {
362-
if _, exists := existingAuditIDs[entry.AuditID]; !exists {
363-
newAuditEntries = append(newAuditEntries, entry)
364-
}
365-
}
361+
newAuditEntries := lo.Filter(log.AuditTrail, func(entry *domain.AuditTrailEntry, _ int) bool {
362+
_, exists := existingAuditIDs[entry.AuditID]
363+
return !exists
364+
})
366365

367366
// Insert only new audit entries
368367
if len(newAuditEntries) > 0 {

0 commit comments

Comments
 (0)