summaryrefslogtreecommitdiffstats
path: root/cmd/jp/split.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/jp/split.go')
-rw-r--r--cmd/jp/split.go40
1 files changed, 35 insertions, 5 deletions
diff --git a/cmd/jp/split.go b/cmd/jp/split.go
index efe59c9..acca93c 100644
--- a/cmd/jp/split.go
+++ b/cmd/jp/split.go
@@ -1,11 +1,34 @@
package main
-import "reflect"
+import (
+ "reflect"
+)
+
+var indexableKind = map[reflect.Kind]bool{
+ reflect.Slice: true,
+ reflect.Array: true,
+}
func flatten(in [][]reflect.Value) (out []reflect.Value) {
for _, a := range in {
- for i := range a {
- out = append(out, a[i])
+ for _, v := range a {
+ if indexableKind[v.Kind()] {
+ sub := make([]reflect.Value, v.Len())
+ for j := 0; j < v.Len(); j++ {
+ sub = append(sub, v.Index((j)))
+ }
+ out = append(out, flatten([][]reflect.Value{sub})...)
+ continue
+ }
+ if v.IsValid() && v.CanInterface() {
+ if sub, ok := v.Interface().([]interface{}); ok {
+ for i := range sub {
+ out = append(out, reflect.ValueOf(sub[i]))
+ }
+ continue
+ }
+ }
+ out = append(out, v)
}
}
return
@@ -14,7 +37,14 @@ func flatten(in [][]reflect.Value) (out []reflect.Value) {
func split(in [][]reflect.Value) (x, y []reflect.Value) {
flat := flatten(in)
n := len(flat)
- x = flat[:n/2]
- y = flat[n/2:]
+ x = make([]reflect.Value, 0, n/2)
+ y = make([]reflect.Value, 0, n/2)
+ for i := range flat {
+ if i&1 == 0 {
+ x = append(x, flat[i])
+ } else {
+ y = append(y, flat[i])
+ }
+ }
return
}