@@ -3,7 +3,6 @@ package vibes
33import (
44 "fmt"
55 "maps"
6- "reflect"
76 "sort"
87)
98
@@ -344,68 +343,3 @@ func sortedHashKeys(entries map[string]Value) []string {
344343 sort .Strings (keys )
345344 return keys
346345}
347-
348- func deepTransformKeys (exec * Execution , value Value , block Value ) (Value , error ) {
349- return deepTransformKeysWithState (exec , value , block , & deepTransformState {
350- seenHashes : make (map [uintptr ]struct {}),
351- seenArrays : make (map [uintptr ]struct {}),
352- })
353- }
354-
355- type deepTransformState struct {
356- seenHashes map [uintptr ]struct {}
357- seenArrays map [uintptr ]struct {}
358- }
359-
360- func deepTransformKeysWithState (exec * Execution , value Value , block Value , state * deepTransformState ) (Value , error ) {
361- switch value .Kind () {
362- case KindHash , KindObject :
363- entries := value .Hash ()
364- id := reflect .ValueOf (entries ).Pointer ()
365- if id != 0 {
366- if _ , seen := state .seenHashes [id ]; seen {
367- return NewNil (), fmt .Errorf ("hash.deep_transform_keys does not support cyclic structures" )
368- }
369- state .seenHashes [id ] = struct {}{}
370- defer delete (state .seenHashes , id )
371- }
372- out := make (map [string ]Value , len (entries ))
373- for _ , key := range sortedHashKeys (entries ) {
374- nextKeyValue , err := exec .CallBlock (block , []Value {NewSymbol (key )})
375- if err != nil {
376- return NewNil (), err
377- }
378- nextKey , err := valueToHashKey (nextKeyValue )
379- if err != nil {
380- return NewNil (), fmt .Errorf ("hash.deep_transform_keys block must return symbol or string" )
381- }
382- nextValue , err := deepTransformKeysWithState (exec , entries [key ], block , state )
383- if err != nil {
384- return NewNil (), err
385- }
386- out [nextKey ] = nextValue
387- }
388- return NewHash (out ), nil
389- case KindArray :
390- items := value .Array ()
391- id := reflect .ValueOf (items ).Pointer ()
392- if id != 0 {
393- if _ , seen := state .seenArrays [id ]; seen {
394- return NewNil (), fmt .Errorf ("hash.deep_transform_keys does not support cyclic structures" )
395- }
396- state .seenArrays [id ] = struct {}{}
397- defer delete (state .seenArrays , id )
398- }
399- out := make ([]Value , len (items ))
400- for i , item := range items {
401- nextValue , err := deepTransformKeysWithState (exec , item , block , state )
402- if err != nil {
403- return NewNil (), err
404- }
405- out [i ] = nextValue
406- }
407- return NewArray (out ), nil
408- default :
409- return value , nil
410- }
411- }
0 commit comments