From 99273cc5e1a96c01a66a657043008e25792da626 Mon Sep 17 00:00:00 2001 From: bitromortac Date: Thu, 24 Nov 2022 15:35:18 +0100 Subject: [PATCH] lntypes+routing: add generic Min/Max functions --- lntypes/comparison.go | 26 ++++++++++++++++++++++++++ lntypes/comparison_test.go | 25 +++++++++++++++++++++++++ routing/unified_edges.go | 11 +++++------ 3 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 lntypes/comparison.go create mode 100644 lntypes/comparison_test.go diff --git a/lntypes/comparison.go b/lntypes/comparison.go new file mode 100644 index 000000000..bffb1a55b --- /dev/null +++ b/lntypes/comparison.go @@ -0,0 +1,26 @@ +package lntypes + +import "golang.org/x/exp/constraints" + +// Number defines a type constraint for numbers. +type Number interface { + constraints.Integer | constraints.Float +} + +// Max returns the greater of the two inputs. +func Max[N Number](op1 N, op2 N) N { + if op1 > op2 { + return op1 + } + + return op2 +} + +// Min returns the lesser of the two inputs. +func Min[N Number](op1 N, op2 N) N { + if op1 < op2 { + return op1 + } + + return op2 +} diff --git a/lntypes/comparison_test.go b/lntypes/comparison_test.go new file mode 100644 index 000000000..61bf35893 --- /dev/null +++ b/lntypes/comparison_test.go @@ -0,0 +1,25 @@ +package lntypes + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// TestMin tests getting correct minimal numbers. +func TestMin(t *testing.T) { + t.Parallel() + + require.Equal(t, 1, Min(1, 1)) + require.Equal(t, 1, Min(1, 2)) + require.Equal(t, 1.5, Min(1.5, 2.5)) +} + +// TestMax tests getting correct maximal numbers. +func TestMax(t *testing.T) { + t.Parallel() + + require.Equal(t, 1, Max(1, 1)) + require.Equal(t, 2, Max(1, 2)) + require.Equal(t, 2.5, Max(1.5, 2.5)) +} diff --git a/routing/unified_edges.go b/routing/unified_edges.go index 1c3574e8d..dfdf44021 100644 --- a/routing/unified_edges.go +++ b/routing/unified_edges.go @@ -3,6 +3,7 @@ package routing import ( "github.com/btcsuite/btcd/btcutil" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/routing/route" ) @@ -223,9 +224,9 @@ func (u *edgeUnifier) getEdgeNetwork(amt lnwire.MilliSatoshi) *unifiedEdge { // Track the maximum time lock of all channels that are // candidate for non-strict forwarding at the routing node. - if edge.policy.TimeLockDelta > maxTimelock { - maxTimelock = edge.policy.TimeLockDelta - } + maxTimelock = lntypes.Max( + maxTimelock, edge.policy.TimeLockDelta, + ) // Use the policy that results in the highest fee for this // specific amount. @@ -264,9 +265,7 @@ func (u *edgeUnifier) getEdgeNetwork(amt lnwire.MilliSatoshi) *unifiedEdge { func (u *edgeUnifier) minAmt() lnwire.MilliSatoshi { min := lnwire.MaxMilliSatoshi for _, edge := range u.edges { - if edge.policy.MinHTLC < min { - min = edge.policy.MinHTLC - } + min = lntypes.Min(min, edge.policy.MinHTLC) } return min