From 4c76000254caf53c427f641ba320e688dc6a3348 Mon Sep 17 00:00:00 2001 From: Alexei Anoshenko <2277098+anoshenko@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:15:43 +0300 Subject: [PATCH] Changed DataValue interface Renamed `ArrayElements() []DataValue` method of DataNode interface to `Array() []DataValue` Added `ArrayElements() iter.Seq[DataValue]` iterator to DataNode interface --- CHANGELOG.md | 4 ++++ animation.go | 2 +- data.go | 25 +++++++++++++++++++++---- properties.go | 2 +- session.go | 2 +- theme.go | 2 +- 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6e4166..2f7e558 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ * Added CreatePopupFromResources, CreatePopupFromText, and CreatePopupFromObject functions * Added implementation of Properties interface to Popup * Changed ParseDataText function return values +* Added `Properties() iter.Seq[DataNode]` iterator to DataObject interface +* Renamed `ArrayElements() []DataValue` method of DataNode interface to `Array() []DataValue` +* Added `ArrayElements() iter.Seq[DataValue]` iterator to DataNode interface + # v0.19.0 diff --git a/animation.go b/animation.go index e8d7ead..e6a5f72 100644 --- a/animation.go +++ b/animation.go @@ -541,7 +541,7 @@ func animationSet(properties Properties, tag PropertyName, value any) []Property case ArrayNode: props := []AnimatedProperty{} - for _, val := range value.ArrayElements() { + for val := range value.ArrayElements() { if val.IsObject() { if prop, ok := parseObject(val.Object()); ok { props = append(props, prop) diff --git a/data.go b/data.go index ff06a30..52ffff4 100644 --- a/data.go +++ b/data.go @@ -93,7 +93,10 @@ type DataNode interface { ArrayElement(index int) DataValue // ArrayElements returns an array of objects if that node is an array - ArrayElements() []DataValue + Array() []DataValue + + // ArrayElements returns an iterator to access the array elements of objects if that node is an array + ArrayElements() iter.Seq[DataValue] // ArrayAsParams returns an array of a params(map) if that node is an array ArrayAsParams() []Params @@ -340,11 +343,25 @@ func (node *dataNode) ArrayElement(index int) DataValue { return nil } -func (node *dataNode) ArrayElements() []DataValue { +func (node *dataNode) Array() []DataValue { if node.array != nil { - return node.array + return slices.Clone(node.array) + } + return []DataValue{node.value} +} + +func (node *dataNode) ArrayElements() iter.Seq[DataValue] { + return func(yield func(DataValue) bool) { + if node.array != nil { + for _, element := range node.array { + if !yield(element) { + return + } + } + } else { + yield(node.value) + } } - return []DataValue{} } func (node *dataNode) ArrayAsParams() []Params { diff --git a/properties.go b/properties.go index c71dd23..4d890e4 100644 --- a/properties.go +++ b/properties.go @@ -127,7 +127,7 @@ func parseProperties(properties Properties, object DataObject) { properties.Set(PropertyName(node.Tag()), node.Object()) case ArrayNode: - properties.Set(PropertyName(node.Tag()), node.ArrayElements()) + properties.Set(PropertyName(node.Tag()), node.Array()) } } } diff --git a/session.go b/session.go index d828160..d8f79d9 100644 --- a/session.go +++ b/session.go @@ -658,7 +658,7 @@ func (session *sessionData) handleRootSize(data DataObject) { func (session *sessionData) handleResize(data DataObject) { if node := data.PropertyByTag("views"); node != nil && node.Type() == ArrayNode { - for _, el := range node.ArrayElements() { + for el := range node.ArrayElements() { if el.IsObject() { obj := el.Object() getFloat := func(tag string) float64 { diff --git a/theme.go b/theme.go index eb3d080..736a8a5 100644 --- a/theme.go +++ b/theme.go @@ -699,7 +699,7 @@ func (theme *theme) addText(themeText string) bool { for node := range obj.Properties() { switch node.Type() { case ArrayNode: - params[PropertyName(node.Tag())] = node.ArrayElements() + params[PropertyName(node.Tag())] = node.Array() case ObjectNode: params[PropertyName(node.Tag())] = node.Object()