refactor: rewrite CLI and internal architecture #41

Merged
mvhutz merged 14 commits from feat/updated-arch into main 2026-02-07 03:25:32 +00:00
7 changed files with 90 additions and 41 deletions
Showing only changes of commit 22e8a99362 - Show all commits

View File

@@ -36,14 +36,15 @@ func main() {
engine, err := r.GetDefaultEngine("lambda") engine, err := r.GetDefaultEngine("lambda")
cli.HandleError(err) cli.HandleError(err)
err = engine.Set(compiled) process := engine.Load()
err = process.Set(compiled)
cli.HandleError(err) cli.HandleError(err)
// Run reduction. // Run reduction.
for engine.Step(1) { for process.Step(1) {
} }
// Return the final reduced result. // Return the final reduced result.
result, err := engine.Get() result, err := process.Get()
cli.HandleError(err) cli.HandleError(err)
output, err := r.Marshal(result) output, err := r.Marshal(result)

View File

@@ -13,14 +13,14 @@ func GetRegistry() *registry.Registry {
r := registry.New() r := registry.New()
// Codecs // Codecs
r.AddConversions(cli.ConvertCodec(convert.Saccharine2Lambda{}, "saccharine", "lambda")...) r.MustAddConversions(cli.ConvertCodec(convert.Saccharine2Lambda{}, "saccharine", "lambda")...)
// Engines // Engines
r.AddEngine(cli.ConvertEngine(&normalorder.Engine{}, "normalorder", "lambda")) r.MustAddEngine(cli.ConvertEngine(normalorder.Engine{}, "normalorder", "lambda"))
// Marshalers // Marshalers
r.AddMarshaler(cli.ConvertMarshaler(lambda.Marshaler{}, "lambda")) r.MustAddMarshaler(cli.ConvertMarshaler(lambda.Marshaler{}, "lambda"))
r.AddMarshaler(cli.ConvertMarshaler(saccharine.Marshaler{}, "saccharine")) r.MustAddMarshaler(cli.ConvertMarshaler(saccharine.Marshaler{}, "saccharine"))
return r return r
} }

View File

@@ -1,14 +1,9 @@
package cli package cli
import ( import "git.maximhutz.com/max/lambda/pkg/engine"
"fmt"
"git.maximhutz.com/max/lambda/pkg/engine"
)
type Engine interface { type Engine interface {
engine.Engine[Repr] Load() Process
Name() string Name() string
InType() string InType() string
} }
@@ -19,31 +14,14 @@ type convertedEngine[T any] struct {
inType string inType string
} }
func (b convertedEngine[T]) InType() string { return b.inType } func (e convertedEngine[T]) InType() string { return e.inType }
func (b convertedEngine[T]) Name() string { return b.name } func (e convertedEngine[T]) Name() string { return e.name }
func (b convertedEngine[T]) Get() (Repr, error) { func (e convertedEngine[T]) Load() Process {
s, err := b.engine.Get() return convertedProcess[T]{e.engine.Load(), e.inType}
if err != nil {
return nil, err
}
return NewRepr(b.inType, s), nil
} }
func (b convertedEngine[T]) Set(r Repr) error { func ConvertEngine[T any](e engine.Engine[T], name, inType string) Engine {
if t, ok := r.Data().(T); ok { return &convertedEngine[T]{e, name, inType}
return b.engine.Set(t)
}
return fmt.Errorf("Incorrent format '%s' for engine '%s'.", r.Id(), b.inType)
}
func (b convertedEngine[T]) Step(i int) bool {
return b.engine.Step(i)
}
func ConvertEngine[T any](e engine.Engine[T], name string, inType string) Engine {
return convertedEngine[T]{e, name, inType}
} }

41
internal/cli/process.go Normal file
View File

@@ -0,0 +1,41 @@
package cli
import (
"fmt"
"git.maximhutz.com/max/lambda/pkg/engine"
)
type Process interface {
engine.Process[Repr]
InType() string
}
type convertedProcess[T any] struct {
process engine.Process[T]
inType string
}
func (e convertedProcess[T]) InType() string { return e.inType }
func (b convertedProcess[T]) Get() (Repr, error) {
s, err := b.process.Get()
if err != nil {
return nil, err
}
return NewRepr(b.inType, s), nil
}
func (b convertedProcess[T]) Set(r Repr) error {
if t, ok := r.Data().(T); ok {
return b.process.Set(t)
}
return fmt.Errorf("Incorrent format '%s' for engine '%s'.", r.Id(), b.inType)
}
func (b convertedProcess[T]) Step(i int) bool {
return b.process.Step(i)
}

View File

@@ -27,6 +27,11 @@ func (r *Registry) AddConversions(conversions ...cli.Conversion) error {
return nil return nil
} }
func (r *Registry) MustAddConversions(conversions ...cli.Conversion) {
if err := r.AddConversions(conversions...); err != nil {
panic(err)
}
}
func (r *Registry) AddMarshaler(c cli.Marshaler) error { func (r *Registry) AddMarshaler(c cli.Marshaler) error {
if _, ok := r.marshalers[c.InType()]; ok { if _, ok := r.marshalers[c.InType()]; ok {
@@ -37,6 +42,12 @@ func (r *Registry) AddMarshaler(c cli.Marshaler) error {
return nil return nil
} }
func (r *Registry) MustAddMarshaler(c cli.Marshaler) {
if err := r.AddMarshaler(c); err != nil {
panic(err)
}
}
func (r *Registry) AddEngine(e cli.Engine) error { func (r *Registry) AddEngine(e cli.Engine) error {
if _, ok := r.engines[e.Name()]; ok { if _, ok := r.engines[e.Name()]; ok {
return fmt.Errorf("engine '%s' already registered", e.Name()) return fmt.Errorf("engine '%s' already registered", e.Name())
@@ -46,6 +57,12 @@ func (r *Registry) AddEngine(e cli.Engine) error {
return nil return nil
} }
func (r *Registry) MustAddEngine(e cli.Engine) {
if err := r.AddEngine(e); err != nil {
panic(err)
}
}
func (r *Registry) GetEngine(name string) (cli.Engine, error) { func (r *Registry) GetEngine(name string) (cli.Engine, error) {
e, ok := r.engines[name] e, ok := r.engines[name]
if !ok { if !ok {

View File

@@ -1,6 +1,10 @@
package engine package engine
type Engine[T any] interface { type Engine[T any] interface {
Load() Process[T]
}
type Process[T any] interface {
Get() (T, error) Get() (T, error)
Set(T) error Set(T) error
Step(int) bool Step(int) bool

View File

@@ -5,20 +5,20 @@ import (
"git.maximhutz.com/max/lambda/pkg/lambda" "git.maximhutz.com/max/lambda/pkg/lambda"
) )
type Engine struct { type Process struct {
expr lambda.Expression expr lambda.Expression
} }
func (e Engine) Get() (lambda.Expression, error) { func (e Process) Get() (lambda.Expression, error) {
return e.expr, nil return e.expr, nil
} }
func (e *Engine) Set(l lambda.Expression) error { func (e *Process) Set(l lambda.Expression) error {
e.expr = l e.expr = l
return nil return nil
} }
func (e *Engine) Step(i int) bool { func (e *Process) Step(i int) bool {
for range i { for range i {
next, reduced := ReduceOnce(e.expr) next, reduced := ReduceOnce(e.expr)
if !reduced { if !reduced {
@@ -31,4 +31,12 @@ func (e *Engine) Step(i int) bool {
return true return true
} }
type Engine struct {
}
func (e Engine) Load() engine.Process[lambda.Expression] {
return &Process{}
}
var _ engine.Process[lambda.Expression] = (*Process)(nil)
var _ engine.Engine[lambda.Expression] = (*Engine)(nil) var _ engine.Engine[lambda.Expression] = (*Engine)(nil)