Files
gocryptotrader/cmd/documentation/exchanges_templates/alert.tmpl
Adrian Gallagher ba92ba3254 docs: Add CODING_GUIDELINES.md and other adjustments (#1988)
* docs: Create new CODING_GUIDELINES doc

Rids excess contribution instructions from other packages
Adds AGENTS.md file for the AI overlords
Rids unused templates
Updates ADD_NEW_EXCHANGE.md with minor fixes

* docs: Fix linter issues and minor adjustments based on Copilot feedback

* docs: Update coding guidelines for API parameters and testing practices

* docs: Remove redundant GoDoc references

Adds copilot-instructions.md

* docs: Update CODING_GUIDELINES with export recommendations and test commentary

* docs: Fix formatting inconsistencies in ADD_NEW_EXCHANGE.md links

* docs: Update struct naming conventions for request and response types

* docs: Improve clarity and consistency in ADD_NEW_EXCHANGE.md and CODING_GUIDELINES.md

* refactor: Simplify error handling in QueryOrder method
2025-08-08 12:10:53 +10:00

90 lines
2.3 KiB
Cheetah

{{define "exchanges alert" -}}
{{template "header" .}}
## 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
}
}
}
```
{{template "donations" .}}
{{end}}