From 25d54bbbec7e3c03367aa972ff8af656dc77bdfe Mon Sep 17 00:00:00 2001
From: Steven Allen <steven@stebalien.com>
Date: Thu, 27 Jun 2019 22:33:53 +0200
Subject: [PATCH] fix: serialize publishing

Ensure that all subscribers see events in the same order. This also ensures that
the subscribers never see the initial "latest" event after some other event.

fixes #16
---
 basic.go | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/basic.go b/basic.go
index c123f2a..6c9d640 100644
--- a/basic.go
+++ b/basic.go
@@ -173,7 +173,7 @@ func (b *basicBus) Subscribe(evtTypes interface{}, opts ...event.SubscriptionOpt
 			out.nodes[i] = n
 		}, func(n *node) {
 			if n.keepLast {
-				l := n.last.Load()
+				l := n.last
 				if l == nil {
 					return
 				}
@@ -223,7 +223,7 @@ func (b *basicBus) Emitter(evtType interface{}, opts ...event.EmitterOpt) (e eve
 
 type node struct {
 	// Note: make sure to NEVER lock basicBus.lk when this lock is held
-	lk sync.RWMutex
+	lk sync.Mutex
 
 	typ reflect.Type
 
@@ -231,7 +231,7 @@ type node struct {
 	nEmitters int32
 
 	keepLast bool
-	last     atomic.Value
+	last     interface{}
 
 	sinks []chan interface{}
 }
@@ -248,13 +248,13 @@ func (n *node) emit(event interface{}) {
 		panic(fmt.Sprintf("Emit called with wrong type. expected: %s, got: %s", n.typ, typ))
 	}
 
-	n.lk.RLock()
+	n.lk.Lock()
 	if n.keepLast {
-		n.last.Store(event)
+		n.last = event
 	}
 
 	for _, ch := range n.sinks {
 		ch <- event
 	}
-	n.lk.RUnlock()
+	n.lk.Unlock()
 }