Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. type Information struct {
  9. Name string // name or description
  10. Date time.Time // deadline (or limit time)
  11. }
  12.  
  13. func (info *Information) String() string {
  14. return fmt.Sprintf("[%s] %s", info.Date.Format("2006-01-02 15:04"), info.Name)
  15. }
  16.  
  17. type Task struct {
  18. Info Information
  19. Subtasks []Information
  20. }
  21.  
  22. func NewTask(info *Information) *Task {
  23. return &Task{
  24. Info: *info,
  25. }
  26. }
  27.  
  28. func (t *Task) AddSubtask(info *Information) {
  29. if t.Subtasks == nil {
  30. t.Subtasks = make([]Information, 0, 1)
  31. }
  32. t.Subtasks = append(t.Subtasks, *info)
  33. }
  34.  
  35. // removeSubtaskはタスクを削除する。
  36. // このメソッドは境界をチェックしないので直接呼び出さない。
  37. func (t *Task) removeSubtask(i int) bool {
  38. l := len(t.Subtasks)
  39. t.Subtasks = append((t.Subtasks)[0:i], (t.Subtasks)[i+1:l]...)
  40. return true
  41. }
  42.  
  43. func (t *Task) String() string {
  44. var str string
  45. str += t.Info.String()
  46. for i, s := range t.Subtasks {
  47. str += fmt.Sprintf("\n\t%3d: %s", i+1, s.String())
  48. }
  49. return str
  50. }
  51.  
  52. type TaskList []Task
  53.  
  54. func (tl *TaskList) AddTask(t *Task) {
  55. if *tl == nil {
  56. *tl = make(TaskList, 0, 1)
  57. }
  58. *tl = append(*tl, *t)
  59. }
  60.  
  61. // removeTaskはタスクを削除する。
  62. // このメソッドは境界をチェックしないので直接呼び出さない。
  63. func (tl *TaskList) removeTask(i int) bool {
  64. l := len(*tl)
  65. *tl = append((*tl)[0:i], (*tl)[i+1:l]...)
  66. return true
  67. }
  68.  
  69. // RemoveItemはタスクまたはサブタスクを削除する。
  70. // removeTask, removeSubtaskは境界をチェックしない安全でないメソッドなので
  71. // これらを直接呼ばずにRemoveItemを使うこと。
  72. func (tl *TaskList) RemoveItem(mainNum, subNum int) bool {
  73. if subNum == 0 {
  74. return tl.removeTask(mainNum - 1)
  75. }
  76. if mainNum < 1 || mainNum > len(*tl) {
  77. return false
  78. }
  79. return (*tl)[mainNum-1].removeSubtask(subNum - 1)
  80. }
  81.  
  82. func (tl *TaskList) String() string {
  83. var str string
  84. sep := ""
  85. for i, t := range *tl {
  86. str += fmt.Sprintf("%s%3d: %s", sep, i+1, t.String())
  87. sep = "\n"
  88. }
  89. return str
  90. }
  91.  
  92. func main() {
  93. var tasks TaskList
  94. tasks.AddTask(NewTask(&Information{Name: "Main Task 1", Date: time.Now()}))
  95. tasks.AddTask(NewTask(&Information{Name: "Main Task 2", Date: time.Now()}))
  96. tasks.AddTask(NewTask(&Information{Name: "Main Task 3", Date: time.Now()}))
  97. tasks[0].AddSubtask(&Information{Name: "Sub Task 1", Date: time.Now()})
  98. tasks[1].AddSubtask(&Information{Name: "Sub Task 1", Date: time.Now()})
  99. tasks[1].AddSubtask(&Information{Name: "Sub Task 2", Date: time.Now()})
  100. tasks[2].AddSubtask(&Information{Name: "Sub Task 1", Date: time.Now()})
  101. fmt.Println(&tasks)
  102. tasks.RemoveItem(2, 1)
  103. fmt.Println("============================================================")
  104. fmt.Println(&tasks)
  105. tasks.RemoveItem(2, 0)
  106. fmt.Println("============================================================")
  107. fmt.Println(&tasks)
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement