Adding cycles for operations
This commit is contained in:
@ -320,7 +320,11 @@ class Sequence(Meta):
|
|||||||
yield from item.evaluate(options)
|
yield from item.evaluate(options)
|
||||||
elif isinstance(item, RepeatedSequence):
|
elif isinstance(item, RepeatedSequence):
|
||||||
item.evaluate_values(options)
|
item.evaluate_values(options)
|
||||||
repeats = item.repeats.get_value(options)
|
# TODO: Refactor this. Parsing and validating cycles for integers only?
|
||||||
|
if isinstance(item.repeats, Cyclic):
|
||||||
|
repeats = item.repeats.get_value().get_value(options)
|
||||||
|
else:
|
||||||
|
repeats = item.repeats.get_value(options)
|
||||||
yield from _normal_repeat(item.evaluated_values, repeats, options)
|
yield from _normal_repeat(item.evaluated_values, repeats, options)
|
||||||
elif isinstance(item, RepeatedListSequence):
|
elif isinstance(item, RepeatedListSequence):
|
||||||
repeats = item.repeats.get_value(options)
|
repeats = item.repeats.get_value(options)
|
||||||
@ -496,13 +500,14 @@ class Ziffers(Sequence):
|
|||||||
cycle_length: int = field(default=0, init=False)
|
cycle_length: int = field(default=0, init=False)
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
loop_i = index % self.cycle_length
|
self.loop_i = index % self.cycle_length
|
||||||
self.loop_i = loop_i
|
|
||||||
new_cycle = floor(index / self.cycle_length)
|
new_cycle = floor(index / self.cycle_length)
|
||||||
if new_cycle > self.cycle_i or new_cycle < self.cycle_i:
|
if new_cycle > self.cycle_i or new_cycle < self.cycle_i:
|
||||||
self.re_eval(self.options)
|
self.re_eval(self.options)
|
||||||
self.cycle_i = new_cycle
|
self.cycle_i = new_cycle
|
||||||
return self.evaluated_values[loop_i]
|
self.cycle_length = len(self.evaluated_values)
|
||||||
|
self.loop_i = index % self.cycle_length
|
||||||
|
return self.evaluated_values[self.loop_i]
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return self
|
return self
|
||||||
@ -733,10 +738,6 @@ class ListOperation(Sequence):
|
|||||||
|
|
||||||
evaluated_values: list = None
|
evaluated_values: list = None
|
||||||
|
|
||||||
def __post_init__(self):
|
|
||||||
super().__post_init__()
|
|
||||||
self.evaluated_values = self.evaluate()
|
|
||||||
|
|
||||||
def evaluate(self, options=DEFAULT_OPTIONS.copy()):
|
def evaluate(self, options=DEFAULT_OPTIONS.copy()):
|
||||||
"""Evaluates the operation"""
|
"""Evaluates the operation"""
|
||||||
|
|
||||||
@ -750,9 +751,15 @@ class ListOperation(Sequence):
|
|||||||
flattened_list.extend(item.evaluated_values)
|
flattened_list.extend(item.evaluated_values)
|
||||||
else:
|
else:
|
||||||
flattened_list.append(filter_operation(item))
|
flattened_list.append(filter_operation(item))
|
||||||
|
elif isinstance(item, Cyclic):
|
||||||
|
value = item.get_value()
|
||||||
|
if isinstance(value,Sequence):
|
||||||
|
flattened_list.extend(filter_operation(value))
|
||||||
|
elif isinstance(value, (Event, RandomInteger, Integer)):
|
||||||
|
flattened_list.append(value)
|
||||||
elif isinstance(item, Range):
|
elif isinstance(item, Range):
|
||||||
flattened_list.extend(list(item.evaluate(options)))
|
flattened_list.extend(list(item.evaluate(options)))
|
||||||
elif isinstance(item, (Event, RandomInteger, Integer, Cyclic)):
|
elif isinstance(item, (Event, RandomInteger, Integer)):
|
||||||
flattened_list.append(item)
|
flattened_list.append(item)
|
||||||
|
|
||||||
if isinstance(input_list, Sequence):
|
if isinstance(input_list, Sequence):
|
||||||
@ -762,7 +769,9 @@ class ListOperation(Sequence):
|
|||||||
|
|
||||||
operators = self.values[1::2] # Fetch every second operator element
|
operators = self.values[1::2] # Fetch every second operator element
|
||||||
values = self.values[::2] # Fetch every second list element
|
values = self.values[::2] # Fetch every second list element
|
||||||
values = filter_operation(values) # Filter out crap
|
values = filter_operation(values) # Filter out
|
||||||
|
if len(values)==1:
|
||||||
|
return values[0] # If right hand doesnt contain anything sensible
|
||||||
left = values[0] # Start results with the first array
|
left = values[0] # Start results with the first array
|
||||||
|
|
||||||
for i, operand in enumerate(operators):
|
for i, operand in enumerate(operators):
|
||||||
|
|||||||
@ -30,8 +30,10 @@
|
|||||||
?roman_number: /iv|v|v?i{1,3}/
|
?roman_number: /iv|v|v?i{1,3}/
|
||||||
|
|
||||||
// Valid as integer
|
// Valid as integer
|
||||||
number: NUMBER | random_integer | cyclic_number
|
number: NUMBER | random_integer | cycle
|
||||||
cyclic_number: "<" number (WS number)* ">"
|
|
||||||
|
// CYCLIC NUMBERS NOT IN USE. NUMBERS MUST BE VALIDATED FROM FULL CYCLES!
|
||||||
|
// cyclic_number: "<" number (WS number)* ">"
|
||||||
|
|
||||||
// Repeats
|
// Repeats
|
||||||
repeat: "[:" sequence ":" [number] "]"
|
repeat: "[:" sequence ":" [number] "]"
|
||||||
|
|||||||
Reference in New Issue
Block a user