Skip to content

Commit

Permalink
Last bit of list binding cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacalz committed Jan 27, 2025
1 parent 3d04105 commit d2f2a06
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 74 deletions.
66 changes: 6 additions & 60 deletions data/binding/bindlists.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,7 @@ func NewBoolList() BoolList {
//
// Since: 2.0
func BindBoolList(v *[]bool) ExternalBoolList {
if v == nil {
return NewBoolList().(ExternalBoolList)
}

b := newExternalListComparable(v)
for i := range *v {
b.appendItem(bindListItemComparable[bool](v, i, b.updateExternal))
}

return b
return bindListComparable(v)
}

// BytesList supports binding a list of []byte values.
Expand Down Expand Up @@ -90,16 +81,7 @@ func NewBytesList() BytesList {
//
// Since: 2.2
func BindBytesList(v *[][]byte) ExternalBytesList {
if v == nil {
return NewBytesList().(ExternalBytesList)
}

b := newExternalList(v, bytes.Equal)
for i := range *v {
b.appendItem(bindListItem(v, i, b.updateExternal, bytes.Equal))
}

return b
return bindList(v, bytes.Equal)
}

// FloatList supports binding a list of float64 values.
Expand Down Expand Up @@ -138,16 +120,7 @@ func NewFloatList() FloatList {
//
// Since: 2.0
func BindFloatList(v *[]float64) ExternalFloatList {
if v == nil {
return NewFloatList().(ExternalFloatList)
}

b := newExternalListComparable(v)
for i := range *v {
b.appendItem(bindListItemComparable(v, i, b.updateExternal))
}

return b
return bindListComparable(v)
}

// IntList supports binding a list of int values.
Expand Down Expand Up @@ -186,16 +159,7 @@ func NewIntList() IntList {
//
// Since: 2.0
func BindIntList(v *[]int) ExternalIntList {
if v == nil {
return NewIntList().(ExternalIntList)
}

b := newExternalListComparable(v)
for i := range *v {
b.appendItem(bindListItemComparable(v, i, b.updateExternal))
}

return b
return bindListComparable(v)
}

// RuneList supports binding a list of rune values.
Expand Down Expand Up @@ -285,16 +249,7 @@ func NewStringList() StringList {
//
// Since: 2.0
func BindStringList(v *[]string) ExternalStringList {
if v == nil {
return NewStringList().(ExternalStringList)
}

b := newExternalListComparable(v)
for i := range *v {
b.appendItem(bindListItemComparable(v, i, b.updateExternal))
}

return b
return bindListComparable(v)
}

// UntypedList supports binding a list of any values.
Expand Down Expand Up @@ -382,14 +337,5 @@ func NewURIList() URIList {
//
// Since: 2.1
func BindURIList(v *[]fyne.URI) ExternalURIList {
if v == nil {
return NewURIList().(ExternalURIList)
}

b := newExternalList(v, compareURI)
for i := range *v {
b.appendItem(bindListItem(v, i, b.updateExternal, compareURI))
}

return b
return bindList(v, compareURI)
}
29 changes: 15 additions & 14 deletions data/binding/generic.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,18 +147,6 @@ func lookupExistingBinding[T any](key string, p fyne.Preferences) (genericItem[T
return nil, false
}

type List[T any] interface {
DataList

Append(value T) error
Get() ([]T, error)
GetValue(index int) (T, error)
Prepend(value T) error
Remove(value T) error
Set(list []T) error
SetValue(index int, value T) error
}

func newList[T any](comparator func(T, T) bool) *boundList[T] {
return &boundList[T]{val: new([]T), comparator: comparator}
}
Expand All @@ -171,8 +159,21 @@ func newExternalList[T any](v *[]T, comparator func(T, T) bool) *boundList[T] {
return &boundList[T]{val: v, comparator: comparator, updateExternal: true}
}

func newExternalListComparable[T bool | float64 | int | rune | string](v *[]T) *boundList[T] {
return newExternalList(v, func(t1, t2 T) bool { return t1 == t2 })
func bindList[T any](v *[]T, comparator func(T, T) bool) *boundList[T] {
if v == nil {
return newList(comparator)
}

l := newExternalList(v, comparator)
for i := range *v {
l.appendItem(bindListItem(v, i, l.updateExternal, comparator))
}

return l
}

func bindListComparable[T bool | float64 | int | rune | string](v *[]T) *boundList[T] {
return bindList(v, func(t1, t2 T) bool { return t1 == t2 })
}

type boundList[T any] struct {
Expand Down

0 comments on commit d2f2a06

Please sign in to comment.