github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/4-purely-functional/ch09-functor-monoid/09_clock_functor/src/functor/clock.go (about) 1 package functor 2 3 import ( 4 "fmt" 5 ) 6 7 type ClockFunctor interface { 8 Map(f func(int) int) ClockFunctor 9 } 10 11 type hourContainer struct { 12 hours []int 13 } 14 15 func (box hourContainer) Map(f func(int) int) ClockFunctor { 16 for i, el := range box.hours { 17 box.hours[i] = f(el) 18 } 19 return box 20 } 21 22 func Wrap(hours []int) ClockFunctor { 23 return hourContainer{hours: hours} 24 } 25 26 var Zero = func(i int) int { 27 return i 28 } 29 30 var AmPmMapper = func(i int) int { 31 return (i + 12) % 24 32 } 33 34 func AmHoursFn() []int { 35 return []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} 36 } 37 38 func (box hourContainer) String() string { 39 return fmt.Sprintf("%+v", box.hours) 40 }