package objects // CountObjects returns the number of objects that a given object o contains. // For scalar value types, it will always be 1. For compound value types, // this will include its elements and all of their elements recursively. func CountObjects(o Object) (c int) { c = 1 switch o := o.(type) { case *Array: for _, v := range o.Value { c += CountObjects(v) } case *ImmutableArray: for _, v := range o.Value { c += CountObjects(v) } case *Map: for _, v := range o.Value { c += CountObjects(v) } case *ImmutableMap: for _, v := range o.Value { c += CountObjects(v) } case *Error: c += CountObjects(o.Value) } return }