github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/3-functional-techniques/ch08-pipelining/03_buffered/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	gc "github.com/go-goodies/go_currency"
     6  )
     7  
     8  func main() {
     9  	orders := GetOrders()
    10  	numberOfOrders := len(orders)
    11  	input := make(chan Order, numberOfOrders)
    12  	output := make(chan Order, numberOfOrders)
    13  	for i := 0; i < numberOfOrders; i++ {
    14  		go func() {
    15  			for order := range input {
    16  				output <- Pipeline(order)
    17  			}
    18  		}()
    19  	}
    20  	for _, order := range orders {
    21  		input <- *order
    22  	}
    23  	close(input)
    24  	for i := 0; i < numberOfOrders; i++ {
    25  		fmt.Println("The result is:", <-output)
    26  	}
    27  }
    28  
    29  func Pipeline(o Order) Order {
    30  	o = Authenticate(o)
    31  	o = Decrypt(o)
    32  	o = Charge(o)
    33  	return o
    34  }
    35  
    36  func Authenticate(o Order) Order  {
    37  	fmt.Printf("Order %d is Authenticated\n", o.OrderNumber)
    38  	return o
    39  }
    40  
    41  func Decrypt(o Order) Order {
    42  	fmt.Printf("Order %d is Decrypted\n", o.OrderNumber)
    43  	return o
    44  }
    45  
    46  func Charge(o Order) Order {
    47  	fmt.Printf("Order %d is Charged\n", o.OrderNumber)
    48  	return o
    49  }
    50  
    51  type Order struct {
    52  	OrderNumber int
    53  	IsValid bool
    54  	Credentials string
    55  	CCardNumber string
    56  	CCardExpDate string
    57  	LineItems []LineItem
    58  }
    59  
    60  type LineItem struct {
    61  	Description string
    62  	Count       int
    63  	PriceUSD    gc.USD
    64  }
    65  func GetOrders() []*Order {
    66  
    67  	order1 := &Order{
    68  		10001,
    69  		true,
    70  		"alice,secret",
    71  		"7b/HWvtIB9a16AYk+Yv6WWwer3GFbxpjoR+GO9iHIYY=",
    72  		"0922",
    73  		[]LineItem{
    74  			{"Apples", 1, gc.USD{4, 50}},
    75  			{"Oranges", 4, gc.USD{12, 00}},
    76  		},
    77  	}
    78  
    79  	order2 := &Order{
    80  		10002,
    81  		true,
    82  		"bob,secret",
    83  		"EOc3kF/OmxY+dRCaYRrey8h24QoGzVU0/T2QKVCHb1Q=",
    84  		"0123",
    85  		[]LineItem{
    86  			{"Milk", 2, gc.USD{8, 00}},
    87  			{"Sugar", 1, gc.USD{2, 25}},
    88  			{"Salt", 3, gc.USD{3, 75}},
    89  		},
    90  	}
    91  	orders := []*Order{order1, order2}
    92  	return orders
    93  }