about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorMarkus Wüstenberg2020-11-02 10:59:16 +0100
committerGitHub2020-11-02 10:59:16 +0100
commit267d40bbea6036f913c4047a6a2055b3e5d7bb96 (patch)
treeef2bcb5be63bb6f9fdfd6a608698473ac2192ea6
parent6c8f0c235287edf7252fe239d4c9beb258c6ff01 (diff)
downloadgomponents-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.go12
-rw-r--r--gomponents.go17
-rw-r--r--gomponents_test.go13
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)
+	})
+}