(i *interpreter, funcv, arrv value)
| 303 | } |
| 304 | |
| 305 | func builtinFlatMap(i *interpreter, funcv, arrv value) (value, error) { |
| 306 | fun, err := i.getFunction(funcv) |
| 307 | if err != nil { |
| 308 | return nil, err |
| 309 | } |
| 310 | switch arrv := arrv.(type) { |
| 311 | case *valueArray: |
| 312 | num := arrv.length() |
| 313 | // Start with capacity of the original array. |
| 314 | // This may spare us a few reallocations. |
| 315 | // TODO(sbarzowski) verify that it actually helps |
| 316 | elems := make([]*cachedThunk, 0, num) |
| 317 | for counter := 0; counter < num; counter++ { |
| 318 | returnedValue, err := fun.call(i, args(arrv.elements[counter])) |
| 319 | if err != nil { |
| 320 | return nil, err |
| 321 | } |
| 322 | returned, err := i.getArray(returnedValue) |
| 323 | if err != nil { |
| 324 | return nil, err |
| 325 | } |
| 326 | elems = append(elems, returned.elements...) |
| 327 | } |
| 328 | return makeValueArray(elems), nil |
| 329 | case valueString: |
| 330 | var str strings.Builder |
| 331 | for _, elem := range arrv.getRunes() { |
| 332 | returnedValue, err := fun.call(i, args(readyThunk(makeValueString(string(elem))))) |
| 333 | if err != nil { |
| 334 | return nil, err |
| 335 | } |
| 336 | returned, err := i.getString(returnedValue) |
| 337 | if err != nil { |
| 338 | return nil, err |
| 339 | } |
| 340 | str.WriteString(returned.getGoString()) |
| 341 | } |
| 342 | return makeValueString(str.String()), nil |
| 343 | default: |
| 344 | return nil, i.Error("std.flatMap second param must be array / string, got " + arrv.getType().name) |
| 345 | } |
| 346 | } |
| 347 | |
| 348 | // builtinFlatMapArray is like builtinFlatMap, but only accepts array as the |
| 349 | // arrv value. Desugared comprehensions contain a call to this function, rather |
no test coverage detected
searching dependent graphs…