From 49904f9097ac848eb02114db1a3d94938c0c90b0 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Wed, 1 May 2024 21:47:27 +0200 Subject: [PATCH] the new ListType type takes the of []any --- formatter.go | 15 +++++++++++ iter-list.go | 4 +-- operand-list.go | 70 ++++++++++++++++++++++++++++--------------------- 3 files changed, 57 insertions(+), 32 deletions(-) create mode 100644 formatter.go diff --git a/formatter.go b/formatter.go new file mode 100644 index 0000000..c1b6e07 --- /dev/null +++ b/formatter.go @@ -0,0 +1,15 @@ +// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). +// All rights reserved. + +// formatter.go +package expr + +type FmtOpt uint16 + +const ( + tty FmtOpt = 1 << iota +) + +type Formatter interface { + ToString(options FmtOpt) string +} diff --git a/iter-list.go b/iter-list.go index 37ccf89..c9ac728 100644 --- a/iter-list.go +++ b/iter-list.go @@ -7,11 +7,11 @@ package expr import "io" type FlatArrayIterator struct { - a []any + a ListType index int } -func NewFlatArrayIterator(array []any) *FlatArrayIterator { +func NewFlatArrayIterator(array ListType) *FlatArrayIterator { return &FlatArrayIterator{a: array, index: 0} } diff --git a/operand-list.go b/operand-list.go index fdfba3b..b82a9bb 100644 --- a/operand-list.go +++ b/operand-list.go @@ -4,6 +4,44 @@ // operand-list.go package expr +import ( + "fmt" + "strings" +) + +type ListType []any + +func (ls *ListType) ToString(opt FmtOpt) string { + var sb strings.Builder + sb.WriteByte('[') + if len(*ls) > 0 { + if opt&MultiLine != 0 { + sb.WriteString("\n ") + } + for i, item := range []any(*ls) { + if i > 0 { + if opt&MultiLine != 0 { + sb.WriteString(",\n ") + } else { + sb.WriteString(", ") + } + } + if s, ok := item.(string); ok { + sb.WriteByte('"') + sb.WriteString(s) + sb.WriteByte('"') + } else { + sb.WriteString(fmt.Sprintf("%v", item)) + } + } + if opt&MultiLine != 0 { + sb.WriteByte('\n') + } + } + sb.WriteByte(']') + return sb.String() +} + // -------- list term func newListTermA(args ...*term) *term { return newListTerm(args) @@ -23,7 +61,7 @@ func newListTerm(args []*term) *term { // -------- list func func evalList(ctx ExprContext, self *term) (v any, err error) { list, _ := self.value().([]*term) - items := make([]any, len(list)) + items := make(ListType, len(list)) for i, tree := range list { var param any if param, err = tree.compute(ctx); err != nil { @@ -32,35 +70,7 @@ func evalList(ctx ExprContext, self *term) (v any, err error) { items[i] = param } if err == nil { - v = items + v = &items } return } - -// // -------- list term -// func newListTerm(args []*term) *term { -// return &term{ -// tk: *NewToken(0, 0, SymList, "[]"), -// parent: nil, -// children: args, -// position: posLeaf, -// priority: priValue, -// evalFunc: evalList, -// } -// } - -// // -------- list func -// func evalList(ctx ExprContext, self *term) (v any, err error) { -// items := make([]any, len(self.children)) -// for i, tree := range self.children { -// var param any -// if param, err = tree.compute(ctx); err != nil { -// break -// } -// items[i] = param -// } -// if err == nil { -// v = items -// } -// return -// }