From 8e80185508a697ddfcfed4a04d3f4e1ac5a330a9 Mon Sep 17 00:00:00 2001 From: Charlie Stanton Date: Mon, 24 Apr 2023 13:16:06 +0100 Subject: WalkItems are now made of Atoms instead of WalkValues, and I have rolled my own JSON parser and serialiser These changes improve performance --- main/main.go | 58 +++++++++++++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 33 deletions(-) (limited to 'main/main.go') diff --git a/main/main.go b/main/main.go index 564d14a..e6730de 100644 --- a/main/main.go +++ b/main/main.go @@ -10,8 +10,8 @@ type Program []Command type ProgramState struct { path, value, xreg []walk.Atom - in chan walk.WalkItem - out chan walk.WalkItem + in walk.JSONIn + out walk.JSONOut program []Command } @@ -40,41 +40,33 @@ func main() { program := Parse(tokens) stdin := bufio.NewReader(os.Stdin) - dataStream := walk.Json(stdin) state := ProgramState { - in: dataStream, - out: make(chan walk.WalkItem), + in: walk.NewJSONIn(stdin), + out: walk.NewJSONOut(), program: program, } - - go func () { - for walkItem := range dataStream { - state.value = walk.Atomise([]walk.WalkValue{walkItem.Value}) - state.path = walk.Atomise(walkItem.Path.ToWalkValues()) - for _, cmd := range state.program { - cmd.exec(&state) - } - if !quiet { - pathValues, err := walk.Compound(state.path) - if err != nil { - panic("Tried to convert invalid atoms to values") - } - path := walk.PathFromWalkValues(pathValues) - values, err := walk.Compound(state.value) - if err != nil { - panic("Tried to convert invalid atoms to values") - } - for _, value := range values { - state.out <- walk.WalkItem { - Value: value, - Path: path, - } - } + + for { + walkItem, err := state.in.Read() + if err != nil { + break + } + state.value = walkItem.Value + state.path = walkItem.Path + for _, cmd := range state.program { + cmd.exec(&state) + } + if !quiet { + pathValues, err := walk.Compound(state.path) + if err != nil { + panic("Tried to convert invalid atoms to values") } + path := walk.PathFromWalkValues(pathValues) + state.out.Print(path, state.value) } - close(state.out) - }() - - walk.JsonOut(state.out) + } + + state.in.AssertDone() + state.out.AssertDone() } \ No newline at end of file -- cgit v1.2.3