From a0f7203996439210b2a40663eeeeb8563ab03d68 Mon Sep 17 00:00:00 2001 From: Grant Ammons Date: Mon, 25 Apr 2016 14:35:43 -0400 Subject: Get grouping working correctly --- todolist/grouper.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 todolist/grouper.go (limited to 'todolist/grouper.go') diff --git a/todolist/grouper.go b/todolist/grouper.go new file mode 100644 index 0000000..25547bf --- /dev/null +++ b/todolist/grouper.go @@ -0,0 +1,63 @@ +package todolist + +type Grouper struct{} + +type GroupedTodos struct { + Groups map[string][]Todo +} + +func (g *Grouper) GroupByContext(todos []Todo) *GroupedTodos { + groups := map[string][]Todo{} + + allContexts := []string{} + + for _, todo := range todos { + allContexts = addIfNotThere(allContexts, todo.Contexts) + } + + for _, todo := range todos { + for _, context := range todo.Contexts { + groups[context] = append(groups[context], todo) + } + } + + return &GroupedTodos{Groups: groups} +} + +func (g *Grouper) GroupByProject(todos []Todo) *GroupedTodos { + groups := map[string][]Todo{} + + allProjects := []string{} + + for _, todo := range todos { + allProjects = addIfNotThere(allProjects, todo.Projects) + } + + for _, todo := range todos { + for _, project := range todo.Projects { + groups[project] = append(groups[project], todo) + } + } + return &GroupedTodos{Groups: groups} +} + +func (g *Grouper) GroupByNothing(todos []Todo) *GroupedTodos { + groups := map[string][]Todo{} + groups["all"] = todos + return &GroupedTodos{Groups: groups} +} + +func addIfNotThere(arr []string, items []string) []string { + for _, item := range items { + there := false + for _, arrItem := range arr { + if item == arrItem { + there = true + } + } + if !there { + arr = append(arr, item) + } + } + return arr +} -- cgit v1.3