From 267d40bbea6036f913c4047a6a2055b3e5d7bb96 Mon Sep 17 00:00:00 2001 From: Markus Wüstenberg Date: Mon, 2 Nov 2020 10:59:16 +0100 Subject: Add Map function (#40) `Map` makes it easier to build lists of elements without having to iterate.--- examples/simple/simple.go | 12 ++++++------ gomponents.go | 17 +++++++++++++++++ gomponents_test.go | 13 +++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/examples/simple/simple.go b/examples/simple/simple.go index 3802f43..dd6dd58 100644 --- a/examples/simple/simple.go +++ b/examples/simple/simple.go @@ -61,11 +61,11 @@ func navbar(props navbarProps) g.Node { {"/foo", "Foo"}, {"/bar", "Bar"}, } - var lis []g.Node - for _, item := range items { - lis = append(lis, el.Li(el.A(item.path, - attr.Classes(map[string]bool{"is-active": props.path == item.path}), - g.Text(item.text)))) - } + lis := g.Map(len(items), func(i int) g.Node { + item := items[i] + return el.Li( + el.A(item.path, attr.Classes(map[string]bool{"is-active": props.path == item.path}), g.Text(item.text)), + ) + }) return el.Ul(attr.Class("nav"), g.Group(lis)) } diff --git a/gomponents.go b/gomponents.go index 178f0a2..02e52ca 100644 --- a/gomponents.go +++ b/gomponents.go @@ -217,3 +217,20 @@ func (g group) Render(io.Writer) error { func Group(children []Node) Node { return group{children: children} } + +// Map something enumerable to a list of Nodes. +// Example: +// items := []string{"hat", "partyhat"} +// +// lis := g.Map(len(items), func(i int) g.Node { +// return g.El("li", g.Text(items[i])) +// }) +// +// list := g.El("ul", lis...) +func Map(length int, cb func(i int) Node) []Node { + var nodes []Node + for i := 0; i < length; i++ { + nodes = append(nodes, cb(i)) + } + return nodes +} diff --git a/gomponents_test.go b/gomponents_test.go index 3028723..0c5dc68 100644 --- a/gomponents_test.go +++ b/gomponents_test.go @@ -183,3 +183,16 @@ func TestGroup(t *testing.T) { } }) } + +func TestMap(t *testing.T) { + t.Run("maps slices to nodes", func(t *testing.T) { + items := []string{"hat", "partyhat", "turtlehat"} + lis := g.Map(len(items), func(i int) g.Node { + return g.El("li", g.Text(items[i])) + }) + + list := g.El("ul", lis...) + + assert.Equal(t, `