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  }