maps: expansion of Key concept (#1349)

* moves everything to use single map keys, also breaks

* full rollout

* tests

* fix a little bug

* minor test fixups

* Fix Key use

* rm 🔑 from 🔑 struct name
This commit is contained in:
Scott
2023-10-04 09:19:41 +10:00
committed by GitHub
parent 033a72b61a
commit 91d699be9d
47 changed files with 1478 additions and 1339 deletions

View File

@@ -7,6 +7,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/backtester/common"
gctcommon "github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/common/key"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
)
@@ -14,7 +15,7 @@ import (
// NewHandlerHolder returns a new HandlerHolder
func NewHandlerHolder() *HandlerHolder {
return &HandlerHolder{
data: make(map[string]map[asset.Item]map[*currency.Item]map[*currency.Item]Handler),
data: make(map[key.ExchangePairAsset]Handler),
}
}
@@ -26,28 +27,15 @@ func (h *HandlerHolder) SetDataForCurrency(e string, a asset.Item, p currency.Pa
h.m.Lock()
defer h.m.Unlock()
if h.data == nil {
h.data = make(map[string]map[asset.Item]map[*currency.Item]map[*currency.Item]Handler)
h.data = make(map[key.ExchangePairAsset]Handler)
}
e = strings.ToLower(e)
m1, ok := h.data[e]
if !ok {
m1 = make(map[asset.Item]map[*currency.Item]map[*currency.Item]Handler)
h.data[e] = m1
}
m2, ok := m1[a]
if !ok {
m2 = make(map[*currency.Item]map[*currency.Item]Handler)
m1[a] = m2
}
m3, ok := m2[p.Base.Item]
if !ok {
m3 = make(map[*currency.Item]Handler)
m2[p.Base.Item] = m3
}
m3[p.Quote.Item] = k
h.data[key.ExchangePairAsset{
Exchange: e,
Base: p.Base.Item,
Quote: p.Quote.Item,
Asset: a,
}] = k
return nil
}
@@ -58,15 +46,9 @@ func (h *HandlerHolder) GetAllData() ([]Handler, error) {
}
h.m.Lock()
defer h.m.Unlock()
var resp []Handler
for _, exchMap := range h.data {
for _, assetMap := range exchMap {
for _, baseMap := range assetMap {
for _, handler := range baseMap {
resp = append(resp, handler)
}
}
}
resp := make([]Handler, 0, len(h.data))
for _, handler := range h.data {
resp = append(resp, handler)
}
return resp, nil
}
@@ -84,7 +66,12 @@ func (h *HandlerHolder) GetDataForCurrency(ev common.Event) (Handler, error) {
exch := ev.GetExchange()
a := ev.GetAssetType()
p := ev.Pair()
handler, ok := h.data[exch][a][p.Base.Item][p.Quote.Item]
handler, ok := h.data[key.ExchangePairAsset{
Exchange: exch,
Base: p.Base.Item,
Quote: p.Quote.Item,
Asset: a,
}]
if !ok {
return nil, fmt.Errorf("%s %s %s %w", exch, a, p, ErrHandlerNotFound)
}
@@ -98,7 +85,7 @@ func (h *HandlerHolder) Reset() error {
}
h.m.Lock()
defer h.m.Unlock()
h.data = make(map[string]map[asset.Item]map[*currency.Item]map[*currency.Item]Handler)
h.data = make(map[key.ExchangePairAsset]Handler)
return nil
}

View File

@@ -10,6 +10,7 @@ import (
"github.com/thrasher-corp/gocryptotrader/backtester/common"
"github.com/thrasher-corp/gocryptotrader/backtester/eventtypes/event"
gctcommon "github.com/thrasher-corp/gocryptotrader/common"
"github.com/thrasher-corp/gocryptotrader/common/key"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
gctkline "github.com/thrasher-corp/gocryptotrader/exchanges/kline"
@@ -37,7 +38,12 @@ func TestSetDataForCurrency(t *testing.T) {
if d.data == nil {
t.Error("expected not nil")
}
if d.data[exch][a][p.Base.Item][p.Quote.Item] != nil {
if d.data[key.ExchangePairAsset{
Exchange: exch,
Base: p.Base.Item,
Quote: p.Quote.Item,
Asset: a,
}] != nil {
t.Error("expected nil")
}
}

View File

@@ -7,6 +7,7 @@ import (
"github.com/shopspring/decimal"
"github.com/thrasher-corp/gocryptotrader/backtester/common"
"github.com/thrasher-corp/gocryptotrader/common/key"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
)
@@ -28,7 +29,7 @@ var (
// HandlerHolder stores an event handler per exchange asset pair
type HandlerHolder struct {
m sync.Mutex
data map[string]map[asset.Item]map[*currency.Item]map[*currency.Item]Handler
data map[key.ExchangePairAsset]Handler
}
// Holder interface dictates what a Data holder is expected to do