astracting appending elemnts to each other

This commit is contained in:
reverend 2021-01-09 16:28:59 +01:00
parent d07b14f879
commit 3233b7bcff

View File

@ -0,0 +1,138 @@
_lanes = {}
_stacks = {}
_last_name = {}
_reset_last_name(block_type=null)
if block_type == null
block_type = called-from[1]
if block_type in _last_name
remove(_last_name, block_type)
_set_last_name(name, block_type=null)
if block_type == null
block_type = called-from[1]
_last_name[block_type] = name
_get_last_name(block_type)
if block_type == null
block_type = called-from[1]
if block_type in _last_name
return _last_name[block_type]
else
return null
_current_block_type()
return called-from[1]
_call_stack_till_first(block_type)
striped = slice(called-from, 2)
block_index = (index(striped, block_type))
if block_index == null
if length(striped) <= 1
return (striped ())
return slice(striped, 1)
stack = ()
for i in (0..block_index)
push(stack, striped[i])
return stack
_push_onto_stack(block, block_type=null)
if block_type == null
block_type = called-from[1]
if block_type in _stacks
stack = _stacks[block_type]
else
stack = ()
push(stack, block)
_stacks[block_type] = stack
_pop_from_stack(block_type=null)
if block_type == null
block_type = called-from[1]
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)
if block_type == null
block_type = called-from[1]
if block_type in _stacks
stack = _stacks[block_type]
remove(_stacks, block_type)
return stack
else
return ()
_put_into_lane(key, value, block_type=null)
if block_type == null
block_type = called-from[1]
if block_type in _lanes
lane = _lanes[block_type]
else
lane = {}
lane[key] = value
_lanes[block_type] = lane
_pop_lane(block_type=null)
if block_type == null
block_type = called-from[1]
if block_type in _lanes
lane = _lanes[block_type]
remove(_lanes, block_type)
return lane
else
return {}
attach(parent_type, suffix, block)
call_stack = _call_stack_till_first(parent_type)
if parent_type in call_stack
// We are called inside a block
_push_onto_stack(block)
//Detect if the selector will be generated
//by an earlier call of RV-Element
_current_block = _current_block_type()
if not _curent_block in (call_stack)
block_list = _pop_stack()
_put_into_lane(suffix, block_list, parent_type)
else
// We are not called inside a block
// Is there a block to attach to
_last_parent_name = _get_last_name(parent_type)
if _last_parent_name != null
& .{_last_parent_name}{suffix}
{block}
tow(name, block, block_type=null)
if block_type == null
block_type = called-from[0]
.{name}
{block}
if block_type in _lanes
for suffix, block_list in _pop_lane(block_type)
& .{name}{suffix}
for b in block_list
{b}
_set_last_name(name, block_type)