diff options
author | Markus Wüstenberg | 2020-11-02 10:59:16 +0100 |
---|---|---|
committer | GitHub | 2020-11-02 10:59:16 +0100 |
commit | 267d40bbea6036f913c4047a6a2055b3e5d7bb96 (patch) | |
tree | ef2bcb5be63bb6f9fdfd6a608698473ac2192ea6 | |
parent | 6c8f0c235287edf7252fe239d4c9beb258c6ff01 (diff) | |
download | gomponents-267d40bbea6036f913c4047a6a2055b3e5d7bb96.tar.lz gomponents-267d40bbea6036f913c4047a6a2055b3e5d7bb96.tar.zst gomponents-267d40bbea6036f913c4047a6a2055b3e5d7bb96.zip |
Add Map function (#40)
`Map` makes it easier to build lists of elements without having to iterate.
-rw-r--r-- | examples/simple/simple.go | 12 | ||||
-rw-r--r-- | gomponents.go | 17 | ||||
-rw-r--r-- | 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, `<ul><li>hat</li><li>partyhat</li><li>turtlehat</li></ul>`, list) + }) +} |