package main import ( "main/walk" "main/subex" ) type PrintValueCommand struct {} func (cmd PrintValueCommand) exec(state *ProgramState) { for _, item := range state.space { state.out <- item } } type ToggleTerminalCommand struct {} func (cmd ToggleTerminalCommand) exec(state *ProgramState) { toggled := map[walk.TerminalValue]walk.TerminalValue { walk.ArrayBegin: walk.MapBegin, walk.ArrayEnd: walk.MapEnd, walk.MapBegin: walk.ArrayBegin, walk.MapEnd: walk.ArrayEnd, } for i := range state.space { terminal, isTerminal := state.space[i].Value.(walk.TerminalValue) if !isTerminal { continue } state.space[i].Value = toggled[terminal] } } type FilteredCommand struct { filter Filter command Command } func (cmd FilteredCommand) exec(state *ProgramState) { for _, item := range state.space { if cmd.filter.exec(item) { cmd.command.exec(state) return } } } type SequenceCommand struct { commands []Command } func (cmd SequenceCommand) exec(state *ProgramState) { for _, command := range cmd.commands { command.exec(state) } } type AppendLiteralCommand struct { values []walk.WalkValue } func (cmd AppendLiteralCommand) exec(state *ProgramState) { for _, value := range cmd.values { state.space = append(state.space, walk.WalkItem { Path: nil, Value: value, }) } } type PrependLiteralCommand struct { values []walk.WalkValue } func (cmd PrependLiteralCommand) exec(state *ProgramState) { var newItems []walk.WalkItem for _, value := range cmd.values { newItems = append(newItems, walk.WalkItem { Path: nil, Value: value, }) } state.space = append(newItems, state.space...) } type NextCommand struct {} func (cmd NextCommand) exec(state *ProgramState) { nextItem := <- state.in state.space = []walk.WalkItem{nextItem} } type AppendNextCommand struct {} func (cmd AppendNextCommand) exec(state *ProgramState) { nextItem := <- state.in state.space = append(state.space, nextItem) } type PrintLiteralsCommand struct { items []walk.WalkItem } func (cmd PrintLiteralsCommand) exec(state *ProgramState) { for _, item := range cmd.items { state.out <- item } } type DeleteAllCommand struct {} func (cmd DeleteAllCommand) exec(state *ProgramState) { state.space = nil } type SubstituteCommand struct { subex subex.SubexState } func (cmd SubstituteCommand) exec(state *ProgramState) { // TODO } type Command interface { exec(*ProgramState) }