package walk import ( "fmt" ) type ValueTerminal int const ( ArrayBegin ValueTerminal = iota ArrayEnd MapBegin MapEnd ) func (value ValueTerminal) Atomise(in []Atom) []Atom { return append(in, NewAtomTerminal(value)) } func (value ValueTerminal) String() string { switch value { case ArrayBegin: return "[" case ArrayEnd: return "]" case MapBegin: return "{" case MapEnd: return "}" default: panic("Unknown TerminalValue") } } type ValueNull struct {} func (value ValueNull) Atomise(in []Atom) []Atom { return append(in, NewAtomNull()) } func (value ValueNull) String() string { return "null" } type ValueBool bool func (value ValueBool) Atomise(in []Atom) []Atom { return append(in, NewAtomBool(bool(value))) } func (value ValueBool) String() string { if value { return "true" } else { return "false" } } type ValueNumber float64 func (value ValueNumber) Atomise(in []Atom) []Atom { return append(in, NewAtomNumber(float64(value))) } func (value ValueNumber) String() string { v := float64(value) return fmt.Sprintf("%f", v) } type ValueString string func (value ValueString) Atomise(in []Atom) []Atom { in = append(in, NewAtomStringTerminal()) for _, char := range value { in = append(in, NewAtomStringRune(char)) } in = append(in, NewAtomStringTerminal()) return in } func (value ValueString) String() string { return fmt.Sprintf("\"%s\"", string(value)) } type Value interface { // Append this values atoms to the input Atomise(in []Atom) []Atom String() string }