func ExamplePublisher() {
	pub := pubsub.Publisher{}
	ch, _ := pub.SubChannel(nil)
	pub.Publish("msg 1")
	pub.Publish("msg 2")
	fmt.Println(<-ch)
	fmt.Println(<-ch)
	// Output:
	// msg 1
	// msg 2
}
func BenchmarkPubSub(b *testing.B) {
	pub := new(pubsub.Publisher)
	r1, _ := pub.SubReader()
	r2, _ := pub.SubReader()
	for i := 0; i < b.N; i++ {
		pub.Publish(i)
		v1 := r1.Read()
		v2 := r2.Read()
		if v1 != v2 || v1 != i {
			b.Fatal("incorrect value")
		}
	}
}
func TestSubReader(t *testing.T) {
	pub := pubsub.Publisher{}
	r, last := pub.SubReader()
	if last != nil {
		t.Fatal("last message shuold be nil")
	}
	pub.Publish("msg 1")
	pub.Publish("msg 2")
	if r.Read() != "msg 1" {
		t.Fatal("incorrect message received")
	}
	if r.Read() != "msg 2" {
		t.Fatal("incorrect message received")
	}
}
func ExamplePublisher_SubChannel() {
	pub := new(pubsub.Publisher)
	ch, _ := pub.SubChannel("close")
	pub.Publish("msg 1")
	pub.Publish("msg 2")
	pub.Publish("close")

	for msg := range ch {
		fmt.Println(msg)
	}
	// Output:
	// msg 1
	// msg 2
	// close
}
func TestSubChannel(t *testing.T) {
	pub := pubsub.Publisher{}
	ch, last := pub.SubChannel(nil)
	if last != nil {
		t.Fatal("last message shuold be nil")
	}
	pub.Publish("msg 1")
	pub.Publish("msg 2")
	pub.Publish(nil)

	if "msg 1" != <-ch {
		t.Fatal("incorrect message received")
	}
	if "msg 2" != <-ch {
		t.Fatal("incorrect message received")
	}
	if nil != <-ch {
		t.Fatal("incorrect message received")
	}
	if _, ok := <-ch; ok {
		t.Fatal("channel should be closed")
	}
}