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

     1  package main
     2  
     3  import (
     4  	"monoid"
     5  	"fmt"
     6  )
     7  
     8  func main() {
     9  
    10  	const name = "Alice"
    11  	stringMonoid := monoid.WrapName(name)
    12  	fmt.Println("NameMonoid")
    13  	fmt.Println("Initial state:", stringMonoid)
    14  	fmt.Println("Zero:", stringMonoid.Zero())
    15  	fmt.Println("1st application:", stringMonoid.Append(name))
    16  	fmt.Println("Chain applications:", stringMonoid.Append(name).Append(name))
    17  
    18  	ints := []int{1, 2, 3}
    19  	intMonoid := monoid.WrapInt(ints)
    20  	fmt.Println("\nIntMonoid")
    21  	fmt.Println("Initial state:", intMonoid)
    22  	fmt.Println("Zero:", intMonoid.Zero())
    23  	fmt.Println("1st application:", intMonoid.Append(ints...))
    24  	fmt.Println("Chain applications:", intMonoid.Append(ints...).Append(ints...))
    25  	fmt.Println("Reduce chain:", intMonoid.Append(ints...).Append(ints...).Reduce())
    26  
    27  	lineitems := []monoid.Lineitem{
    28  		{1, 12978, 22330},
    29  		{2, 530, 786},
    30  		{5, 270, 507},
    31  	}
    32  	lineitemMonoid := monoid.WrapLineitem(lineitems)
    33  	fmt.Println("\nLineItemMonoid")
    34  	fmt.Println("Initial state:", lineitemMonoid)
    35  	fmt.Println("Zero:", lineitemMonoid.Zero())
    36  	fmt.Println("1st application:", lineitemMonoid.Append(lineitems...))
    37  	fmt.Println("Chain applications:", lineitemMonoid.Append(lineitems...).Append(lineitems...))
    38  	fmt.Println("Reduce chain:", lineitemMonoid.Append(lineitems...).Append(lineitems...).Reduce())
    39  }