Skip to content

Commit

Permalink
Merge pull request #8996 from ProofOfKeags/dual
Browse files Browse the repository at this point in the history
[MICRO]: lntypes: Add Dual[A] primitive type
  • Loading branch information
Roasbeef authored Aug 16, 2024
2 parents 0aced5c + 34f7c31 commit 7c24e33
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions lntypes/channel_party.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,70 @@ func (p ChannelParty) IsLocal() bool {
func (p ChannelParty) IsRemote() bool {
return p == Remote
}

// Dual represents a structure when we are tracking the same parameter for both
// the Local and Remote parties.
type Dual[A any] struct {
// Local is the value tracked for the Local ChannelParty.
Local A

// Remote is the value tracked for the Remote ChannelParty.
Remote A
}

// GetForParty gives Dual an access method that takes a ChannelParty as an
// argument. It is included for ergonomics in cases where the ChannelParty is
// in a variable and which party determines how we want to access the Dual.
func (d *Dual[A]) GetForParty(p ChannelParty) A {
switch p {
case Local:
return d.Local
case Remote:
return d.Remote
default:
panic(fmt.Sprintf(
"switch default triggered in ForParty: %v", p,
))
}
}

// SetForParty sets the value in the Dual for the given ChannelParty. This
// returns a copy of the original value.
func (d *Dual[A]) SetForParty(p ChannelParty, value A) {
switch p {
case Local:
d.Local = value
case Remote:
d.Remote = value
default:
panic(fmt.Sprintf(
"switch default triggered in ForParty: %v", p,
))
}
}

// ModifyForParty applies the function argument to the given ChannelParty field
// and returns a new copy of the Dual.
func (d *Dual[A]) ModifyForParty(p ChannelParty, f func(A) A) A {
switch p {
case Local:
d.Local = f(d.Local)
return d.Local
case Remote:
d.Remote = f(d.Remote)
return d.Remote
default:
panic(fmt.Sprintf(
"switch default triggered in ForParty: %v", p,
))
}
}

// MapDual applies the function argument to both the Local and Remote fields of
// the Dual[A] and returns a Dual[B] with that function applied.
func MapDual[A, B any](d Dual[A], f func(A) B) Dual[B] {
return Dual[B]{
Local: f(d.Local),
Remote: f(d.Remote),
}
}

0 comments on commit 7c24e33

Please sign in to comment.