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  }