github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/4-purely-functional/ch09-functor-monoid/10_car_functor/src/functor/car.go (about) 1 package functor 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type ( 9 Car struct { 10 Make string `json:"make"` 11 Model string `json:"model"` 12 } 13 ) 14 15 type CarFunctor interface { 16 Map(f func(Car) Car) CarFunctor 17 } 18 19 type carContainer struct { 20 cars []Car 21 } 22 23 func (box carContainer) Map(f func(Car) Car) CarFunctor { 24 for i, el := range box.cars { 25 box.cars[i] = f(el) 26 } 27 return box 28 } 29 30 func Wrap(cars []Car) CarFunctor { 31 return carContainer{cars: cars} 32 } 33 34 var ( 35 Zero = func(i Car) Car { 36 return i 37 } 38 39 Upgrade = func(car Car) Car { 40 if !strings.Contains(car.Model, " LX") { 41 car.Model += " LX" 42 } else if !strings.Contains(car.Model, " Limited") { 43 car.Model += " Limited" 44 } 45 return car 46 } 47 48 Downgrade = func(car Car) Car { 49 if strings.Contains(car.Model, " Limited") { 50 car.Model = strings.Replace(car.Model, " Limited", "", -1) 51 } else if strings.Contains(car.Model, " LX") { 52 car.Model = strings.Replace(car.Model, " LX", "", -1) 53 } 54 return car 55 } 56 ) 57 58 func (box carContainer) String() string { 59 return fmt.Sprintf("%+v", box.cars) 60 }