people.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. type Employee struct {
  7. ID int
  8. FirstName string
  9. LastName string
  10. DateHired time.Time
  11. }
  12. type Manager struct {
  13. Employee
  14. Reports []int
  15. }
  16. type SimpleEmployeeData struct {
  17. employees map[int]Employee
  18. managers map[int]Manager
  19. nextID int
  20. }
  21. func NewSimpleEmployeeData() *SimpleEmployeeData {
  22. return &SimpleEmployeeData{
  23. employees: map[int]Employee{},
  24. managers: map[int]Manager{},
  25. nextID: 0,
  26. }
  27. }
  28. func (ed *SimpleEmployeeData) AddEmployee(firstName, lastName string, dateHired time.Time) int {
  29. ed.nextID++
  30. ed.employees[ed.nextID] = Employee{
  31. ID: ed.nextID,
  32. FirstName: firstName,
  33. LastName: lastName,
  34. DateHired: dateHired,
  35. }
  36. return ed.nextID
  37. }
  38. func (ed SimpleEmployeeData) GetEmployee(id int) (Employee, bool) {
  39. p, ok := ed.employees[id]
  40. return p, ok
  41. }
  42. func (ed *SimpleEmployeeData) AddManager(firstName, lastName string, dateHired time.Time, reports []int) int {
  43. ed.nextID++
  44. ed.managers[ed.nextID] = Manager{
  45. Employee: Employee{
  46. ID: ed.nextID,
  47. FirstName: firstName,
  48. LastName: lastName,
  49. DateHired: dateHired,
  50. },
  51. Reports: reports,
  52. }
  53. return ed.nextID
  54. }
  55. func (ed SimpleEmployeeData) GetManager(id int) (Manager, bool) {
  56. m, ok := ed.managers[id]
  57. return m, ok
  58. }
  59. func DMYToTime(day int, month time.Month, year int) time.Time {
  60. return time.Date(year, month, day, 0, 0, 0, 0, time.UTC)
  61. }
  62. func main() {
  63. ed := NewSimpleEmployeeData()
  64. manageEmployees(ed)
  65. }
  66. func manageEmployees(ed EmployeeData) {
  67. e1ID := ed.AddEmployee("Bob", "Bobson", DMYToTime(10, time.January, 2020))
  68. e2ID := ed.AddEmployee("Mary", "Maryson", DMYToTime(30, time.March, 2007))
  69. e1, exists1 := ed.GetEmployee(e1ID)
  70. e2, exists2 := ed.GetEmployee(e2ID)
  71. fmt.Println(e1, exists1)
  72. fmt.Println(e2, exists2)
  73. e3, exists3 := ed.GetEmployee(2000)
  74. fmt.Println(e3, exists3)
  75. m1ID := ed.AddManager("Boss", "BossPerson", DMYToTime(17, time.June, 1982), []int{e1ID, e2ID})
  76. m1, _ := ed.GetManager(m1ID)
  77. fmt.Println(m1.FirstName, m1.Reports)
  78. var e4 = m1.Employee
  79. fmt.Println(e4.LastName)
  80. fmt.Println(FormatTenure(e1))
  81. fmt.Println(FormatTenure(e2))
  82. fmt.Println(m1.TimeAtCompany())
  83. fmt.Println(FormatTenure(m1))
  84. fmt.Println(m1)
  85. }
  86. type Dater interface {
  87. TimeAtCompany() time.Duration
  88. }
  89. func FormatTenure(d Dater) string {
  90. // convert from hours to years and days (ignoring leap years)
  91. hours := int(d.TimeAtCompany().Hours())
  92. years := hours / (24 * 365)
  93. hours = hours % (24 * 365)
  94. days := hours / 24
  95. return fmt.Sprintf("%d years, %d days", years, days)
  96. }
  97. func (e Employee) TimeAtCompany() time.Duration {
  98. return time.Since(e.DateHired)
  99. }
  100. func (e Employee) String() string {
  101. return e.FirstName + " " + e.LastName + ": Tenure " + FormatTenure(e)
  102. }
  103. func (m Manager) String() string {
  104. return fmt.Sprintf("%s, reports: %v", m.Employee, m.Reports)
  105. }
  106. type EmployeeData interface {
  107. AddEmployee(firstName, lastName string, dateHired time.Time) int
  108. GetEmployee(id int) (Employee, bool)
  109. AddManager(firstName, lastName string, dateHired time.Time, reports []int) int
  110. GetManager(id int) (Manager, bool)
  111. }