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)
 			}