pkg/list: remove Flatten and simpilfy FlattenN
Use int instead of Decimal.
Change-Id: I8c4a1eecc7424b7caf833137a020109d71667995
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/3785
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/builtin_test.go b/cue/builtin_test.go
index 7e5d41e..57ad4a5 100644
--- a/cue/builtin_test.go
+++ b/cue/builtin_test.go
@@ -156,12 +156,6 @@
test("list", `list.Drop([1, 2, 3, 4], -1)`),
`_|_(error in call to list.Drop: negative index)`,
}, {
- test("list", `list.Flatten([1, [[2, 3], []], [4]])`),
- `[1,2,3,4]`,
- }, {
- test("list", `list.Flatten("foo")`),
- `_|_(error in call to list.Flatten: cannot use value "foo" (type string) as list)`,
- }, {
test("list", `list.FlattenN([1, [[2, 3], []], [4]], -1)`),
`[1,2,3,4]`,
}, {
@@ -178,7 +172,7 @@
`_|_(error in call to list.FlattenN: cannot use value "foo" (type string) as list)`,
}, {
test("list", `list.FlattenN([], "foo")`),
- `_|_(cannot use "foo" (type string) as number in argument 2 to list.FlattenN)`,
+ `_|_(cannot use "foo" (type string) as int in argument 2 to list.FlattenN)`,
}, {
test("list", `list.Max([1, 2, 3, 4])`),
`4`,
diff --git a/cue/builtins.go b/cue/builtins.go
index ef2f823..80eec8a 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -686,46 +686,14 @@
}()
},
}, {
- Name: "Flatten",
- Params: []kind{topKind},
- Result: listKind,
- Func: func(c *callCtxt) {
- xs := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- var flatten func(Value) ([]Value, error)
- flatten = func(xs Value) ([]Value, error) {
- var res []Value
- iter, err := xs.List()
- if err != nil {
- return nil, err
- }
- for iter.Next() {
- val := iter.Value()
- if val.Kind() == ListKind {
- vals, err := flatten(val)
- if err != nil {
- return nil, err
- }
- res = append(res, vals...)
- } else {
- res = append(res, val)
- }
- }
- return res, nil
- }
- return flatten(xs)
- }()
- },
- }, {
Name: "FlattenN",
- Params: []kind{topKind, numKind},
+ Params: []kind{topKind, intKind},
Result: listKind,
Func: func(c *callCtxt) {
- xs, depth := c.value(0), c.decimal(1)
+ xs, depth := c.value(0), c.int(1)
c.ret, c.err = func() (interface{}, error) {
- var flattenN func(Value, *internal.Decimal) ([]Value, error)
- one := apd.New(1, 0)
- flattenN = func(xs Value, depth *internal.Decimal) ([]Value, error) {
+ var flattenN func(Value, int) ([]Value, error)
+ flattenN = func(xs Value, depth int) ([]Value, error) {
var res []Value
iter, err := xs.List()
if err != nil {
@@ -733,17 +701,13 @@
}
for iter.Next() {
val := iter.Value()
- if val.Kind() == ListKind && !depth.IsZero() {
- d := apd.New(0, 0)
- _, err := internal.BaseContext.Sub(d, depth, one)
+ if val.Kind() == ListKind && depth != 0 {
+ d := depth - 1
+ values, err := flattenN(val, d)
if err != nil {
return nil, err
}
- vals, err := flattenN(val, d)
- if err != nil {
- return nil, err
- }
- res = append(res, vals...)
+ res = append(res, values...)
} else {
res = append(res, val)
}
diff --git a/pkg/list/list.go b/pkg/list/list.go
index 7f37933..a069942 100644
--- a/pkg/list/list.go
+++ b/pkg/list/list.go
@@ -20,8 +20,6 @@
"sort"
"cuelang.org/go/cue"
- "cuelang.org/go/internal"
- "github.com/cockroachdb/apd/v2"
)
// Drop reports the suffix of list x after the first n elements,
@@ -47,41 +45,46 @@
return x[n:], nil
}
-// Flatten reports a flattend sequence of the list xs by expanding any elements
-// that are lists.
+// TODO: disable Flatten until we know the right default for depth.
+// The right time to determine is at least some point after the query
+// extensions are introduced, which may provide flatten functionality
+// natively.
//
-// For instance:
-//
-// Flatten([1, [[2, 3], []], [4]])
-//
-// results in
-//
-// [1, 2, 3, 4]
-//
-func Flatten(xs cue.Value) ([]cue.Value, error) {
- var flatten func(cue.Value) ([]cue.Value, error)
- flatten = func(xs cue.Value) ([]cue.Value, error) {
- var res []cue.Value
- iter, err := xs.List()
- if err != nil {
- return nil, err
- }
- for iter.Next() {
- val := iter.Value()
- if val.Kind() == cue.ListKind {
- vals, err := flatten(val)
- if err != nil {
- return nil, err
- }
- res = append(res, vals...)
- } else {
- res = append(res, val)
- }
- }
- return res, nil
- }
- return flatten(xs)
-}
+// // Flatten reports a flattend sequence of the list xs by expanding any elements
+// // that are lists.
+// //
+// // For instance:
+// //
+// // Flatten([1, [[2, 3], []], [4]])
+// //
+// // results in
+// //
+// // [1, 2, 3, 4]
+// //
+// func Flatten(xs cue.Value) ([]cue.Value, error) {
+// var flatten func(cue.Value) ([]cue.Value, error)
+// flatten = func(xs cue.Value) ([]cue.Value, error) {
+// var res []cue.Value
+// iter, err := xs.List()
+// if err != nil {
+// return nil, err
+// }
+// for iter.Next() {
+// val := iter.Value()
+// if val.Kind() == cue.ListKind {
+// vals, err := flatten(val)
+// if err != nil {
+// return nil, err
+// }
+// res = append(res, vals...)
+// } else {
+// res = append(res, val)
+// }
+// }
+// return res, nil
+// }
+// return flatten(xs)
+// }
// FlattenN reports a flattend sequence of the list xs by expanding any elements
// depth levels deep. If depth is negative all elements are expanded.
@@ -94,10 +97,9 @@
//
// [1, [2, 3], [], 4]
//
-func FlattenN(xs cue.Value, depth *internal.Decimal) ([]cue.Value, error) {
- var flattenN func(cue.Value, *internal.Decimal) ([]cue.Value, error)
- one := apd.New(1, 0)
- flattenN = func(xs cue.Value, depth *internal.Decimal) ([]cue.Value, error) {
+func FlattenN(xs cue.Value, depth int) ([]cue.Value, error) {
+ var flattenN func(cue.Value, int) ([]cue.Value, error)
+ flattenN = func(xs cue.Value, depth int) ([]cue.Value, error) {
var res []cue.Value
iter, err := xs.List()
if err != nil {
@@ -105,17 +107,13 @@
}
for iter.Next() {
val := iter.Value()
- if val.Kind() == cue.ListKind && !depth.IsZero() {
- d := apd.New(0, 0)
- _, err := internal.BaseContext.Sub(d, depth, one)
+ if val.Kind() == cue.ListKind && depth != 0 {
+ d := depth - 1
+ values, err := flattenN(val, d)
if err != nil {
return nil, err
}
- vals, err := flattenN(val, d)
- if err != nil {
- return nil, err
- }
- res = append(res, vals...)
+ res = append(res, values...)
} else {
res = append(res, val)
}