diff options
Diffstat (limited to 'cmd/jp/split.go')
-rw-r--r-- | cmd/jp/split.go | 40 |
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 } |