alphaqiu / EventEmitter

Event Subscriber and Publisher like nodejs EventEmitter

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

EventEmitter

Build Status Coverage Status Hex.pm language Go Report Card

example:

package main

import (
	"fmt"
	"github.com/alphaqiu/EventEmitter/event"
	"sync"
	"time"
)

const (
	fireEvent event.EventType = "fire"
)

func main() {

	emitter := event.NewEmitter(2)

	c := make(chan string, 1)
	go func() {
		identity, listener := emitter.Subscribe(fireEvent)
		if listener == nil {
			return
		}
		c <- identity

		for event := range listener {
			fmt.Printf("device 1: %s\n", event.GetData())
		}
	}()

	go func() {
		emitter.On(fireEvent, doEvent())
	}()

	go func() {
		_, listener := emitter.Once(fireEvent)
		if listener == nil {
			return
		}

		for event := range listener {
			fmt.Printf("device 2: %s\n", event.GetData())
		}
	}()

	times := 10
	counter := 0
	var wg sync.WaitGroup
	wg.Add(times)
	go func() {
		time.Sleep(time.Second)
		for {
			if counter >= times {
				break
			}

			if counter == 5 {
				emitter.UnSubscribe(<-c)
			}

			time.Sleep(2 * time.Millisecond)
			event := event.GenericEvent{
				EventType: fireEvent,
				Data: []byte(fmt.Sprintf("fire in the hole %d", counter)),
			}
			emitter.Emit(event)
			counter += 1
			wg.Done()
		}
	}()


	wg.Wait()
	time.Sleep(5 * time.Second)
}

func doEvent() event.Callback {
	ch := make(chan event.Event)
	go func() {
		for e := range ch {
			fmt.Printf("device 3: %s\n", e.GetData())
		}
	}()
	return func(event event.Event){
		ch <- event
	}
}

About

Event Subscriber and Publisher like nodejs EventEmitter

License:Apache License 2.0


Languages

Language:Go 95.0%Language:Makefile 5.0%