go-calc/calc/macro.go

102 lines
1.9 KiB
Go
Raw Permalink Normal View History

2024-02-21 10:42:56 +00:00
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
}