# GoCryptoTrader package Alert

<img src="/common/gctlogo.png?raw=true" width="350px" height="350px" hspace="70">


[![Build Status](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/thrasher-corp/gocryptotrader/actions/workflows/tests.yml)
[![Software License](https://img.shields.io/badge/License-MIT-orange.svg?style=flat-square)](https://github.com/thrasher-corp/gocryptotrader/blob/master/LICENSE)
[![GoDoc](https://godoc.org/github.com/thrasher-corp/gocryptotrader?status.svg)](https://godoc.org/github.com/thrasher-corp/gocryptotrader/exchanges/alert)
[![Coverage Status](http://codecov.io/github/thrasher-corp/gocryptotrader/coverage.svg?branch=master)](http://codecov.io/github/thrasher-corp/gocryptotrader?branch=master)
[![Go Report Card](https://goreportcard.com/badge/github.com/thrasher-corp/gocryptotrader)](https://goreportcard.com/report/github.com/thrasher-corp/gocryptotrader)


This alert package is part of the GoCryptoTrader codebase.

## This is still in active development

You can track ideas, planned features and what's in progress on this Trello board: [https://trello.com/b/ZAhMhpOy/gocryptotrader](https://trello.com/b/ZAhMhpOy/gocryptotrader).

Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader Slack](https://join.slack.com/t/gocryptotrader/shared_invite/enQtNTQ5NDAxMjA2Mjc5LTc5ZDE1ZTNiOGM3ZGMyMmY1NTAxYWZhODE0MWM5N2JlZDk1NDU0YTViYzk4NTk3OTRiMDQzNGQ1YTc4YmRlMTk)

## Alert

+ This package allows for multiple routines to wait for a state change on any required data.

### Examples:

+ Implementation:

```go
// SomeChangingType defines an example struct with an embedded alert.Notice
// type for easy access to the notice methods.
type SomeChangingType struct {
	ValueThatChanges int64
	alert.Notice
	mu sync.Mutex // Protection for routine shenanigans
}

// Update will update in a separate routine
func (s *SomeChangingType) Update(newValue int64) {
	// This simulates a changing variable or state
	s.mu.Lock()
	s.ValueThatChanges = newValue
	// This will alert any routines that are currently waiting for a change
	s.Alert()
	s.mu.Unlock()
}

// WhatsTheValue will retrieve the value that was changed and should be
// different from the past value. Efficiency++
func (s *SomeChangingType) WhatsTheValue() int64 {
	s.mu.Lock()
	value := s.ValueThatChanges
	s.mu.Unlock()
	return value
}
```

+ Routine waiting for change:

```go
// ExampleRoutineThatWaits defines an exchange potential routine that will wait
// for an impending change.
func ExampleRoutineThatWaits(potentialChange *SomeChangingType) {
	// Every iteration requires a Wait() call.
	for range potentialChange.Wait(nil) {
		val := potentialChange.WhatsTheValue()
		fmt.Println("Value:", val)
	}
}

// AnotherExampleRoutineThatWaits defines an exchange potential routine that 
// will wait for an impending change.
func AnotherExampleRoutineThatWaits(potentialChange *SomeChangingType) {
	// Every iteration requires a Wait() call.
	for {
		select {
			case <-potentialChange.Wait(nil):
				val := potentialChange.WhatsTheValue()
				fmt.Println("Value:", val)
			case <-shutdownChannel:
				fmt.Println("Good-Bye!")
			return 
		}
	}
}


// WARNING: PLEASE DON'T DO THIS.
// This will stop alerting for this specific data type due to the shared nature 
// of the underlying channels using a sync.Pool.
func ABadExampleRoutineThatWaits(potentialChange *SomeChangingType) {
	capturedChannel := potentialChange.Wait(nil)
	for {
		select {
			case <-capturedChannel:
				// This will produce incorrect results or no change. 
				val := potentialChange.WhatsTheValue()
				fmt.Println("Value:", val)
			case <-shutdownChannel:
				fmt.Println("Good-Bye!")
			return 
		}
	}
}
```

### Please click GoDocs chevron above to view current GoDoc information for this package

## Contribution

Please feel free to submit any pull requests or suggest any desired features to be added.

When submitting a PR, please abide by our coding guidelines:

+ Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)).
+ Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines.
+ Code must adhere to our [coding style](https://github.com/thrasher-corp/gocryptotrader/blob/master/doc/coding_style.md).
+ Pull requests need to be based on and opened against the `master` branch.

## Donations

<img src="https://github.com/thrasher-corp/gocryptotrader/blob/master/web/src/assets/donate.png?raw=true" hspace="70">

If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to:

***bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc***
