diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..295001f8
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,9 @@
+.PHONY: docs
+REPO:=github.com/tendermint/go-events
+
+docs:
+ @go get github.com/davecheney/godoc2md
+ godoc2md $(REPO) > README.md
+
+test:
+ go test -v ./...
diff --git a/README.md b/README.md
index 737cbaae..c435e728 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,175 @@
-# go-events
-PubSub in Go with event caching.
+
+
+# events
+`import "github.com/tendermint/go-events"`
+
+* [Overview](#pkg-overview)
+* [Index](#pkg-index)
+
+## Overview
+Pub-Sub in go with event caching
+
+
+
+
+## Index
+* [type EventCache](#EventCache)
+ * [func NewEventCache(evsw Fireable) *EventCache](#NewEventCache)
+ * [func (evc *EventCache) FireEvent(event string, data EventData)](#EventCache.FireEvent)
+ * [func (evc *EventCache) Flush()](#EventCache.Flush)
+* [type EventCallback](#EventCallback)
+* [type EventData](#EventData)
+* [type EventSwitch](#EventSwitch)
+ * [func NewEventSwitch() EventSwitch](#NewEventSwitch)
+* [type Eventable](#Eventable)
+* [type Fireable](#Fireable)
+
+
+#### Package files
+[event_cache.go](/src/github.com/tendermint/go-events/event_cache.go) [events.go](/src/github.com/tendermint/go-events/events.go) [log.go](/src/github.com/tendermint/go-events/log.go)
+
+
+
+
+
+
+## type [EventCache](/src/target/event_cache.go?s=152:215#L1)
+``` go
+type EventCache struct {
+ // contains filtered or unexported fields
+}
+```
+An EventCache buffers events for a Fireable
+All events are cached. Filtering happens on Flush
+
+
+
+
+
+
+
+### func [NewEventCache](/src/target/event_cache.go?s=275:320#L5)
+``` go
+func NewEventCache(evsw Fireable) *EventCache
+```
+Create a new EventCache with an EventSwitch as backend
+
+
+
+
+
+### func (\*EventCache) [FireEvent](/src/target/event_cache.go?s=534:596#L19)
+``` go
+func (evc *EventCache) FireEvent(event string, data EventData)
+```
+Cache an event to be fired upon finality.
+
+
+
+
+### func (\*EventCache) [Flush](/src/target/event_cache.go?s=773:803#L26)
+``` go
+func (evc *EventCache) Flush()
+```
+Fire events by running evsw.FireEvent on all cached events. Blocks.
+Clears cached events
+
+
+
+
+## type [EventCallback](/src/target/events.go?s=4182:4221#L175)
+``` go
+type EventCallback func(data EventData)
+```
+
+
+
+
+
+
+
+
+
+## type [EventData](/src/target/events.go?s=236:287#L4)
+``` go
+type EventData interface {
+}
+```
+Generic event data can be typed and registered with tendermint/go-wire
+via concrete implementation of this interface
+
+
+
+
+
+
+
+
+
+
+## type [EventSwitch](/src/target/events.go?s=553:760#L19)
+``` go
+type EventSwitch interface {
+ Service
+ Fireable
+
+ AddListenerForEvent(listenerID, event string, cb EventCallback)
+ RemoveListenerForEvent(event string, listenerID string)
+ RemoveListener(listenerID string)
+}
+```
+
+
+
+
+
+
+### func [NewEventSwitch](/src/target/events.go?s=902:935#L36)
+``` go
+func NewEventSwitch() EventSwitch
+```
+
+
+
+
+## type [Eventable](/src/target/events.go?s=371:433#L10)
+``` go
+type Eventable interface {
+ SetEventSwitch(evsw EventSwitch)
+}
+```
+reactors and other modules should export
+this interface to become eventable
+
+
+
+
+
+
+
+
+
+
+## type [Fireable](/src/target/events.go?s=483:551#L15)
+``` go
+type Fireable interface {
+ FireEvent(event string, data EventData)
+}
+```
+an event switch or cache implements fireable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+- - -
+Generated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md)
diff --git a/events.go b/events.go
index 15cbfd5b..e613a8e0 100644
--- a/events.go
+++ b/events.go
@@ -1,3 +1,6 @@
+/*
+Pub-Sub in go with event caching
+*/
package events
import (
diff --git a/events_test.go b/events_test.go
index 8766a57d..c1b48b16 100644
--- a/events_test.go
+++ b/events_test.go
@@ -5,6 +5,8 @@ import (
"math/rand"
"testing"
"time"
+
+ "github.com/stretchr/testify/assert"
)
// TestAddListenerForEventFireOnce sets up an EventSwitch, subscribes a single
@@ -207,6 +209,50 @@ func TestAddAndRemoveListener(t *testing.T) {
}
}
+// TestRemoveListener does basic tests on adding and removing
+func TestRemoveListener(t *testing.T) {
+ evsw := NewEventSwitch()
+ started, err := evsw.Start()
+ if started == false || err != nil {
+ t.Errorf("Failed to start EventSwitch, error: %v", err)
+ }
+ count := 10
+ sum1, sum2 := 0, 0
+ // add some listeners and make sure they work
+ evsw.AddListenerForEvent("listener", "event1",
+ func(data EventData) {
+ sum1 += 1
+ })
+ evsw.AddListenerForEvent("listener", "event2",
+ func(data EventData) {
+ sum2 += 1
+ })
+ for i := 0; i < count; i++ {
+ evsw.FireEvent("event1", true)
+ evsw.FireEvent("event2", true)
+ }
+ assert.Equal(t, count, sum1)
+ assert.Equal(t, count, sum2)
+
+ // remove one by event and make sure it is gone
+ evsw.RemoveListenerForEvent("event2", "listener")
+ for i := 0; i < count; i++ {
+ evsw.FireEvent("event1", true)
+ evsw.FireEvent("event2", true)
+ }
+ assert.Equal(t, count*2, sum1)
+ assert.Equal(t, count, sum2)
+
+ // remove the listener entirely and make sure both gone
+ evsw.RemoveListener("listener")
+ for i := 0; i < count; i++ {
+ evsw.FireEvent("event1", true)
+ evsw.FireEvent("event2", true)
+ }
+ assert.Equal(t, count*2, sum1)
+ assert.Equal(t, count, sum2)
+}
+
// TestAddAndRemoveListenersAsync sets up an EventSwitch, subscribes two
// listeners to three events, and fires a thousand integers for each event.
// These two listeners serve as the baseline validation while other listeners