_lanes = {} _stacks = {} _last_name = {} _block_type(block_type) if block_type == null block_type = called-from[1] return block_type _reset_last_name(block_type=null) block_type = _block_type(block_type) if block_type in _last_name remove(_last_name, block_type) _set_last_name(name, block_type=null) block_type = _block_type(block_type) _last_name[block_type] = name _get_last_name(block_type) block_type = _block_type(block_type) if block_type in _last_name return _last_name[block_type] else return null _push_onto_stack(block, block_type=null) block_type = _block_type(block_type) if block_type in _stacks stack = _stacks[block_type] else stack = () push(stack, block) _stacks[block_type] = stack _pop_from_stack(block_type=null) block_type = _block_type(block_type) if block_type in _stacks stack = _stacks[block_type] b = pop(stack) if length(stack) > 0 _stacks[block_type] else remove(_stacks, block_type) return b return null _pop_stack(block_type=null) block_type = _block_type(block_type) if block_type in _stacks stack = _stacks[block_type] remove(_stacks, block_type) return stack else return () _last_element_of_stack(block_type=null) block_type = _block_type(block_type) if block_type in _stacks stack = _stacks[block_type] return stack[-1] else return null _set_lane(lane_name, value, block_type=null) block_type = _block_type(block_type) if block_type in _lanes lane = _lanes[block_type] else lane = {} if lane_name in lane stack = lane[lane_name] else stack = () push(stack, value) lane[lane_name] = stack _lanes[block_type] = lane _get_lane(block_type) block_type = _block_type(block_type) if block_type in _lanes return _lanes[block_type] else return {} _put_into_lane(key, value, block_type=null) block_type = _block_type(block_type) if block_type in _lanes lane = _lanes[block_type] else lane = {} lane[key] = value _lanes[block_type] = lane _pop_lane(block_type=null) block_type = _block_type(block_type) if block_type in _lanes lane = _lanes[block_type] remove(_lanes, block_type) return lane else return {}