package calc import ( "fmt" "gitea.zaclys.com/bvaudour/gob/number" "gitea.zaclys.com/bvaudour/gob/option" ) type MacroElement = option.Choice[number.Number, CalcFunc] type MacroStack []MacroElement type Macro map[string]MacroStack func MacroNumber(n number.Number) MacroElement { return option.Left[number.Number, CalcFunc](n) } func MacroCommand(c CalcFunc) MacroElement { return option.Right[number.Number, CalcFunc](c) } func (s MacroStack) Clone() MacroStack { out := make(MacroStack, len(s)) copy(out, s) return out } func NewMacroStack(args ...any) option.Result[MacroStack] { var s MacroStack for _, e := range args { if n, ok := e.(number.Number); ok { s = append(s, MacroNumber(n)) } else if c, ok := e.(CalcFunc); ok { s = append(s, MacroCommand(c)) } else { return option.Err[MacroStack](ErrIsUnknow(fmt.Sprint(e))) } } return option.Ok(s) } func (m Macro) Exists(k string) (ok bool) { _, ok = m[k] return } func (m Macro) Set(k string, s MacroStack) { m[k] = s } func (m Macro) SetStack(k string, args ...any) (err option.Option[error]) { result := NewMacroStack(args...) if s, ok := result.Ok(); ok { m.Set(k, s) } else if e, ok := result.Err(); ok { err = option.Some(e) } return } func (m Macro) Get(k string) (result option.Result[MacroStack]) { if s, ok := m[k]; ok { result = option.Ok(s.Clone()) } else { result = option.Err[MacroStack](ErrNotExist(mac(k))) } return } func (m Macro) Reset(k string) (err option.Option[error]) { if m.Exists(k) { delete(m, k) } else { err = option.Some(ErrNotExist(mac(k))) } return } func (m Macro) ResetAll() (err option.Option[error]) { if len(m) > 0 { for k := range m { delete(m, k) } } else { err = option.Some(ErrIsEmpty(errMemory)) } return } func (m Macro) Clone() Macro { out := make(Macro) for k, s := range m { out[k] = s.Clone() } return out }