@@ -25,20 +25,13 @@ class _String:
2525 def __init__ (self , value ):
2626 self .value = value
2727
28-
2928def _array_keys (value ):
30- keys = []
31- i = 0
32- for _ in value :
33- keys .append (i )
34- i += 1
35- return keys
29+ for i in range (len (value )):
30+ yield i
3631
3732def _object_keys (value ):
38- keys = []
3933 for key in value :
40- keys .append (key )
41- return keys
34+ yield key
4235
4336def _is_array (value ):
4437 return isinstance (value , (list , tuple ))
@@ -56,24 +49,6 @@ def _index(known, input, value):
5649 known .value .append (index )
5750 return index
5851
59- def _loop (keys , input , known , output ):
60- for key in keys :
61- value = output [key ]
62- if isinstance (value , _String ):
63- _ref (key , input [int (value .value )], input , known , output )
64-
65- return output
66-
67- def _ref (key , value , input , known , output ):
68- if _is_array (value ) and value not in known :
69- known .append (value )
70- value = _loop (_array_keys (value ), input , known , value )
71- elif _is_object (value ) and value not in known :
72- known .append (value )
73- value = _loop (_object_keys (value ), input , known , value )
74-
75- output [key ] = value
76-
7752def _relate (known , input , value ):
7853 if _is_string (value ) or _is_array (value ) or _is_object (value ):
7954 try :
@@ -83,6 +58,22 @@ def _relate(known, input, value):
8358
8459 return value
8560
61+ def _resolver (input , lazy , parsed ):
62+ def resolver (output ):
63+ keys = _array_keys (output ) if _is_array (output ) else _object_keys (output ) if _is_object (output ) else []
64+ for key in keys :
65+ value = output [key ]
66+ if isinstance (value , _String ):
67+ tmp = input [int (value .value )]
68+ output [key ] = tmp
69+ if (_is_array (tmp ) or _is_object (tmp )) and tmp not in parsed :
70+ parsed .append (tmp )
71+ lazy .append ([output , key ])
72+
73+ return output
74+
75+ return resolver
76+
8677def _transform (known , input , value ):
8778 if _is_array (value ):
8879 output = []
@@ -128,12 +119,16 @@ def parse(value, *args, **kwargs):
128119 input .append (value )
129120
130121 value = input [0 ]
122+ lazy = []
123+ revive = _resolver (input , lazy , [value ])
131124
132- if _is_array (value ):
133- return _loop (_array_keys (value ), input , [value ], value )
125+ value = revive (value )
134126
135- if _is_object (value ):
136- return _loop (_object_keys (value ), input , [value ], value )
127+ i = 0
128+ while i < len (lazy ):
129+ o , k = lazy [i ]
130+ i += 1
131+ o [k ] = revive (o [k ])
137132
138133 return value
139134
0 commit comments