Add nomove state transition option, session partitioned interactive example
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user