github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/4-purely-functional/ch09-functor-monoid/10_car_functor/main.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"functor"
     7  	"strings"
     8  )
     9  
    10  func main() {
    11  
    12  	cars := []functor.Car{
    13  		{"Honda", "Accord"},
    14  		{"Lexus", "IS250"}}
    15  
    16  	str := `{"make": "Toyota", "model": "Highlander"}`
    17  	highlander := functor.Car{}
    18  	json.Unmarshal([]byte(str), &highlander)
    19  	cars = append(cars, highlander)
    20  
    21  	fmt.Println("initial state   :", functor.Wrap(cars))
    22  	fmt.Println("unit application:", functor.Wrap(cars).Map(functor.Zero))
    23  	fmt.Println("one  upgrade    :", functor.Wrap(cars).Map(functor.Upgrade))
    24  	fmt.Println("chain upgrades  :", functor.Wrap(cars).Map(functor.Upgrade).Map(functor.Upgrade))
    25  	fmt.Println("one downgrade   :", functor.Wrap([]functor.Car{{"Honda", "Accord"}, {"Lexus", "IS250 LX"}, {"Toyota", "Highlander LX Limited"}}).Map(functor.Downgrade))
    26  
    27  	fmt.Println("up and downgrade:", functor.Wrap(cars).Map(functor.Upgrade).Map(functor.Downgrade))
    28  
    29  	cars2 := []functor.Car{}
    30  	for _, car := range cars {
    31  		if !strings.Contains(car.Model, " LX") {
    32  			car.Model += " LX"
    33  		} else if !strings.Contains(car.Model, " Limited") {
    34  			car.Model += " Limited"
    35  		}
    36  		cars2 = append(cars2, car)
    37  	}
    38  	cars3 := []functor.Car{}
    39  	for _, car := range cars2 {
    40  		if strings.Contains(car.Model, " Limited") {
    41  			car.Model = strings.Replace(car.Model, " Limited", "", -1)
    42  		} else if strings.Contains(car.Model, " LX") {
    43  			car.Model = strings.Replace(car.Model, " LX", "", -1)
    44  		}
    45  		cars3 = append(cars3, car)
    46  	}
    47  	fmt.Println("up and downgrade:", cars3)
    48  }