Add nomove state transition option, session partitioned interactive example

This commit is contained in:
lash
2023-04-16 12:15:57 +01:00
parent bf1d634474
commit f06bca7abf
19 changed files with 177 additions and 73 deletions

View File

@@ -9,7 +9,7 @@ import (
)
// NewDefaultEngine is a convenience function to instantiate a filesystem-backed engine with no output constraints.
func NewDefaultEngine(dir string) (Engine, error) {
func NewDefaultEngine(dir string) Engine {
st := state.NewState(0)
rs := resource.NewFsResource(dir)
ca := cache.NewCache()
@@ -21,7 +21,7 @@ func NewDefaultEngine(dir string) (Engine, error) {
}
// NewSizedEngine is a convenience function to instantiate a filesystem-backed engine with a specified output constraint.
func NewSizedEngine(dir string, size uint32) (Engine, error) {
func NewSizedEngine(dir string, size uint32) Engine {
st := state.NewState(0)
rs := resource.NewFsResource(dir)
ca := cache.NewCache()

View File

@@ -33,7 +33,7 @@ type Engine struct {
}
// NewEngine creates a new Engine
func NewEngine(cfg Config, st *state.State, rs resource.Resource, ca cache.Memory, ctx context.Context) (Engine, error) {
func NewEngine(cfg Config, st *state.State, rs resource.Resource, ca cache.Memory, ctx context.Context) Engine {
var szr *render.Sizer
if cfg.OutputSize > 0 {
szr = render.NewSizer(cfg.OutputSize)
@@ -46,17 +46,19 @@ func NewEngine(cfg Config, st *state.State, rs resource.Resource, ca cache.Memor
vm: vm.NewVm(st, rs, ca, szr),
}
engine.root = cfg.Root
return engine, nil
return engine
}
// Init must be explicitly called before using the Engine instance.
//
// It loads and executes code for the start node.
func(en *Engine) Init(sym string, ctx context.Context) error {
func(en *Engine) Init(ctx context.Context) error {
if en.initd {
log.Printf("already initialized")
return nil
}
sym := en.root
if sym == "" {
return fmt.Errorf("start sym empty")
}
@@ -97,7 +99,7 @@ func(en *Engine) Init(sym string, ctx context.Context) error {
func (en *Engine) Exec(input []byte, ctx context.Context) (bool, error) {
var err error
if en.st.Moves == 0 {
err = en.Init(en.root, ctx)
err = en.Init(ctx)
if err != nil {
return false, err
}
@@ -165,6 +167,7 @@ func(en *Engine) WriteResult(w io.Writer, ctx context.Context) (int, error) {
return io.WriteString(w, r)
}
// start execution over at top node while keeping current state of client error flags.
func(en *Engine) reset(ctx context.Context) error {
var err error
var isTop bool
@@ -181,5 +184,5 @@ func(en *Engine) reset(ctx context.Context) error {
}
en.st.Restart()
en.initd = false
return en.Init(en.root, ctx)
return en.Init(ctx)
}

View File

@@ -81,14 +81,11 @@ func TestEngineInit(t *testing.T) {
rs := NewFsWrapper(dataDir, &st)
ca := cache.NewCache().WithCacheSize(1024)
en, err := NewEngine(Config{
en := NewEngine(Config{
Root: "root",
}, &st, &rs, ca, ctx)
if err != nil {
t.Fatal(err)
}
err = en.Init("root", ctx)
err = en.Init(ctx)
if err != nil {
t.Fatal(err)
}
@@ -141,13 +138,10 @@ func TestEngineExecInvalidInput(t *testing.T) {
ca := cache.NewCache().WithCacheSize(1024)
en, err := NewEngine(Config{
en := NewEngine(Config{
Root: "root",
}, &st, &rs, ca, ctx)
if err != nil {
t.Fatal(err)
}
err = en.Init("root", ctx)
err := en.Init(ctx)
if err != nil {
t.Fatal(err)
}
@@ -164,13 +158,10 @@ func TestEngineResumeTerminated(t *testing.T) {
rs := NewFsWrapper(dataDir, &st)
ca := cache.NewCache().WithCacheSize(1024)
en, err := NewEngine(Config{
en := NewEngine(Config{
Root: "root",
}, &st, &rs, ca, ctx)
if err != nil {
t.Fatal(err)
}
err = en.Init("root", ctx)
err := en.Init(ctx)
if err != nil {
t.Fatal(err)
}

View File

@@ -23,11 +23,8 @@ func TestLoopTop(t *testing.T) {
cfg := Config{
Root: "root",
}
en, err := NewEngine(cfg, &st, &rs, ca, ctx)
if err != nil {
t.Fatal(err)
}
err = en.Init("root", ctx)
en := NewEngine(cfg, &st, &rs, ca, ctx)
err := en.Init(ctx)
if err != nil {
t.Fatal(err)
}
@@ -62,11 +59,8 @@ func TestLoopBackForth(t *testing.T) {
cfg := Config{
Root: "root",
}
en, err := NewEngine(cfg, &st, &rs, ca, ctx)
if err != nil {
t.Fatal(err)
}
err = en.Init("root", ctx)
en := NewEngine(cfg, &st, &rs, ca, ctx)
err := en.Init(ctx)
if err != nil {
t.Fatal(err)
}
@@ -99,11 +93,8 @@ func TestLoopBrowse(t *testing.T) {
OutputSize: 68,
Root: "root",
}
en, err := NewEngine(cfg, &st, &rs, ca, ctx)
if err != nil {
t.Fatal(err)
}
err = en.Init("root", ctx)
en := NewEngine(cfg, &st, &rs, ca, ctx)
err := en.Init(ctx)
if err != nil {
t.Fatal(err)
}

View File

@@ -24,10 +24,7 @@ func RunPersisted(cfg Config, rs resource.Resource, pr persist.Persister, input
return err
}
en, err := NewEngine(cfg, pr.GetState(), rs, pr.GetMemory(), ctx)
if err != nil {
return err
}
en := NewEngine(cfg, pr.GetState(), rs, pr.GetMemory(), ctx)
c, err := en.WriteResult(w, ctx)
if err != nil {