aboutsummaryrefslogtreecommitdiffstats
path: root/todolist/todo_list.go
diff options
context:
space:
mode:
authorGrant Ammons <gammons@gmail.com>2016-06-12 09:49:38 -0400
committerGrant Ammons <gammons@gmail.com>2016-06-12 09:49:38 -0400
commitd8d4510d2faebff633d6e98fa4812f2461ae85b6 (patch)
treebe474ce669a994767867f2224d8cdd4103271aee /todolist/todo_list.go
parentfd9121e03c18c7dfd947e98ea4cec545f110a804 (diff)
Refactor todolist stuff out of the file store implementation
Diffstat (limited to 'todolist/todo_list.go')
-rw-r--r--todolist/todo_list.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/todolist/todo_list.go b/todolist/todo_list.go
new file mode 100644
index 0000000..d7e1f83
--- /dev/null
+++ b/todolist/todo_list.go
@@ -0,0 +1,98 @@
+package todolist
+
+import "sort"
+
+type TodoList struct {
+ Data []*Todo
+}
+
+func (t *TodoList) Load(todos []*Todo) {
+ t.Data = todos
+}
+
+func (t *TodoList) Add(todo *Todo) {
+ todo.Id = t.NextId()
+ t.Data = append(t.Data, todo)
+}
+
+func (t *TodoList) Delete(id int) {
+ i := -1
+ for index, todo := range t.Data {
+ if todo.Id == id {
+ i = index
+ }
+ }
+
+ t.Data = append(t.Data[:i], t.Data[i+1:]...)
+}
+
+func (t *TodoList) Complete(id int) {
+ todo := t.FindById(id)
+ todo.Completed = true
+ t.Delete(id)
+ t.Data = append(t.Data, todo)
+}
+
+func (t *TodoList) Uncomplete(id int) {
+ todo := t.FindById(id)
+ todo.Completed = false
+ t.Delete(id)
+ t.Data = append(t.Data, todo)
+}
+
+func (t *TodoList) Archive(id int) {
+ todo := t.FindById(id)
+ todo.Archived = true
+ t.Delete(id)
+ t.Data = append(t.Data, todo)
+}
+
+func (t *TodoList) Unarchive(id int) {
+ todo := t.FindById(id)
+ todo.Archived = false
+ t.Delete(id)
+ t.Data = append(t.Data, todo)
+}
+
+func (t *TodoList) IndexOf(todoToFind *Todo) int {
+ for i, todo := range t.Data {
+ if todo.Id == todoToFind.Id {
+ return i
+ }
+ }
+ return -1
+}
+
+type ByDate []*Todo
+
+func (a ByDate) Len() int { return len(a) }
+func (a ByDate) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a ByDate) Less(i, j int) bool {
+ t1Due := a[i].CalculateDueTime()
+ t2Due := a[j].CalculateDueTime()
+ return t1Due.Before(t2Due)
+}
+
+func (t *TodoList) Todos() []*Todo {
+ sort.Sort(ByDate(t.Data))
+ return t.Data
+}
+
+func (t *TodoList) NextId() int {
+ maxId := 0
+ for _, todo := range t.Data {
+ if todo.Id > maxId {
+ maxId = todo.Id
+ }
+ }
+ return maxId + 1
+}
+
+func (t *TodoList) FindById(id int) *Todo {
+ for _, todo := range t.Data {
+ if todo.Id == id {
+ return todo
+ }
+ }
+ return nil
+}