| 
						 | 
						- # ISC License
 - #
 - # Copyright (c) 2018-2025, Andrea Giammarchi, @WebReflection
 - #
 - # Permission to use, copy, modify, and/or distribute this software for any
 - # purpose with or without fee is hereby granted, provided that the above
 - # copyright notice and this permission notice appear in all copies.
 - #
 - # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 - # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 - # AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 - # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 - # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 - # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 - # PERFORMANCE OF THIS SOFTWARE.
 - 
 - import json as _json
 - 
 - class _Known:
 -     def __init__(self):
 -         self.key = []
 -         self.value = []
 - 
 - class _String:
 -     def __init__(self, value):
 -         self.value = value
 - 
 - 
 - def _array_keys(value):
 -     keys = []
 -     i = 0
 -     for _ in value:
 -         keys.append(i)
 -         i += 1
 -     return keys
 - 
 - def _object_keys(value):
 -     keys = []
 -     for key in value:
 -         keys.append(key)
 -     return keys
 - 
 - def _is_array(value):
 -     return isinstance(value, (list, tuple))
 - 
 - def _is_object(value):
 -     return isinstance(value, dict)
 - 
 - def _is_string(value):
 -     return isinstance(value, str)
 - 
 - def _index(known, input, value):
 -     input.append(value)
 -     index = str(len(input) - 1)
 -     known.key.append(value)
 -     known.value.append(index)
 -     return index
 - 
 - def _loop(keys, input, known, output):
 -     for key in keys:
 -         value = output[key]
 -         if isinstance(value, _String):
 -             _ref(key, input[int(value.value)], input, known, output)
 - 
 -     return output
 - 
 - def _ref(key, value, input, known, output):
 -     if _is_array(value) and value not in known:
 -         known.append(value)
 -         value = _loop(_array_keys(value), input, known, value)
 -     elif _is_object(value) and value not in known:
 -         known.append(value)
 -         value = _loop(_object_keys(value), input, known, value)
 - 
 -     output[key] = value
 - 
 - def _relate(known, input, value):
 -     if _is_string(value) or _is_array(value) or _is_object(value):
 -         try:
 -             return known.value[known.key.index(value)]
 -         except:
 -             return _index(known, input, value)
 - 
 -     return value
 - 
 - def _transform(known, input, value):
 -     if _is_array(value):
 -         output = []
 -         for val in value:
 -             output.append(_relate(known, input, val))
 -         return output
 - 
 -     if _is_object(value):
 -         obj = {}
 -         for key in value:
 -             obj[key] = _relate(known, input, value[key])
 -         return obj
 - 
 -     return value
 - 
 - def _wrap(value):
 -     if _is_string(value):
 -         return _String(value)
 - 
 -     if _is_array(value):
 -         i = 0
 -         for val in value:
 -             value[i] = _wrap(val)
 -             i += 1
 - 
 -     elif _is_object(value):
 -         for key in value:
 -             value[key] = _wrap(value[key])
 - 
 -     return value
 - 
 - def parse(value, *args, **kwargs):
 -     json = _json.loads(value, *args, **kwargs)
 -     wrapped = []
 -     for value in json:
 -         wrapped.append(_wrap(value))
 - 
 -     input = []
 -     for value in wrapped:
 -         if isinstance(value, _String):
 -             input.append(value.value)
 -         else:
 -             input.append(value)
 - 
 -     value = input[0]
 - 
 -     if _is_array(value):
 -         return _loop(_array_keys(value), input, [value], value)
 - 
 -     if _is_object(value):
 -         return _loop(_object_keys(value), input, [value], value)
 - 
 -     return value
 - 
 - 
 - def stringify(value, *args, **kwargs):
 -     known = _Known()
 -     input = []
 -     output = []
 -     i = int(_index(known, input, value))
 -     while i < len(input):
 -         output.append(_transform(known, input, input[i]))
 -         i += 1
 -     return _json.dumps(output, *args, **kwargs)
 
 
  |