stream.Compose

Join 2 or more streams in a single one.

Function signature

    func Compose(streams []stream.S) (stream stream.S) 

Arguments

Name Type Description
streams Array of Streams List of streams to be joined

Output

Name Type Description
strea, stream.S A new stream that will contain both the items and operations in all the the joined streams

Errors


Type Message
err.invalid-argument To compose a new stream, 2 or more streams mut be passed as argument
err.invalid-argument An stream can not be composed with stream of different type

Examples

package main

import (
	"fmt"
	"github.com/wesovilabs/koazee"
)

var numbers = []int{1, 2, 3, 4}
var numbers2 = []int{5, 6, 7, 8}

func main() {
	stream1 := koazee.Stream().
		With(numbers).
		Map(func(val int) int {
			return val * 2
		})
	stream2 := koazee.StreamOf(numbers2)
	fmt.Println(koazee.Stream().Compose(stream1, stream2).Reduce(func(acc,val int)int{return acc+val}).Int())

}
package main

import (
	"fmt"
	"github.com/wesovilabs/koazee"
)

type genre int

const (
	female genre = iota
	male
)

type primate struct {
	name   string
	age    int
	family string
	genre  genre
}

func newPrimate(name string, age int, family string, genre genre) *primate {
	return &primate{
		name:   name,
		age:    age,
		family: family,
		genre:  genre,
	}
}

var primates = []*primate{
	newPrimate("John", 15, "Capuchin", male),
	newPrimate("Laura", 12, "Squirrel monkey", female),
}

var primates2 = []*primate{
	newPrimate("Benjamin", 23, "Spider monkey", male),
	newPrimate("George", 19, "Golden Lion Tamarin", male),
	newPrimate("Jane", 33, "Orangutan", female),
	newPrimate("Sarah", 7, "Gibbon", female),
}

func main() {
	stream1 := koazee.StreamOf(primates).Filter(func(primate *primate) bool {
		return primate.genre == male
	})
	stream2 := koazee.StreamOf(primates2).Filter(func(primate *primate) bool {
		return primate.genre == male
	})
	koazee.Stream().Compose(stream1, stream2).ForEach(func(primate *primate) {
		fmt.Println("Hi there, this is %s", primate.name)
	}).Out()
}