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 }