# GoCryptoTrader package Alert [![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 If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to: ***bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc***