|                                                                                                                                             |  | # 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)
 |