Source code for generic.interval_set_generic_utils
"""
A class containing the "interface" for creation ex-novo of intervalsets*,
with the key feature that the actual class to instantiate when creating these
is set upon creation of the IntervalSetGenericUtils instance.
In this way, a "utils" object can be spawned by IntervalSets or analogous
classes and with a common set of methods an "utils" creates intervalsets
of the appropriate type.
"""
from clothesline.exceptions import (
UnparseableDictError,
UnserializableItemError,
UnsupportedVersionDictError,
)
[docs]class IntervalSetGenericUtils:
"""
An "interval set utils" class. Instances are able to use the provided
'name of an interval set class' and create standard out-of-the-box
intervals.
"""
def __init__(self, interval_set_class):
"""
An instance of IntervalSetGenericUtils needs to know what class
to use to create intervalsets* (and intervals*).
From this knowledge, all other properties and instantiators
are crafted internally (also to create the right type of objects).
"""
interval_class = interval_set_class.interval_class
self.set_instantiator = interval_set_class
# the above would be: lambda intervals: interval_set_class(intervals)
self.int_utils = interval_class.utils()
self.serializing_class = interval_set_class.serializing_class
self.serializing_version = interval_set_class.serializing_version
[docs] def from_dict(self, input_dict):
"""
Extract an instance of this interval set from a dict,
using the provided serializability settings
(including checking dict metadata match).
"""
if self.serializing_class is None or self.serializing_version is None:
raise UnserializableItemError
#
if input_dict.get("class") != self.serializing_class:
raise UnparseableDictError
# Here, in the future, version upgrade logic will be injected
if input_dict.get("version", 0) > self.serializing_version:
raise UnsupportedVersionDictError
if input_dict.get("version") != self.serializing_version:
raise UnparseableDictError
#
return self.set_instantiator(
self.int_utils.from_dict(interval_dict)
for interval_dict in input_dict["intervals"]
)
[docs] def empty(self):
"""
Create the empty set.
"""
return self.set_instantiator([])
[docs] def open(self, value_begin, value_end):
"""
Create an open interval set with finite boundaries.
"""
return self.set_instantiator(
[self.int_utils.open(value_begin, value_end)],
)
[docs] def closed(self, value_begin, value_end):
"""
Create a closed interval set with finite boundaries.
"""
return self.set_instantiator(
[self.int_utils.closed(value_begin, value_end)],
)
[docs] def point(self, value):
"""
Create a zero-length degenerate [x, x] point-line 'interval set'.
"""
return self.set_instantiator([self.int_utils.point(value)])
[docs] def low_slice(self, value_end, included=False):
"""
Create an interval set from -inf to a certain value.
"""
return self.set_instantiator(
[self.int_utils.low_slice(value_end, included=included)],
)
[docs] def high_slice(self, value_begin, included=False):
"""
Create an interval set from a value up to +inf.
"""
return self.set_instantiator(
[self.int_utils.high_slice(value_begin, included=included)],
)
[docs] def all(self):
"""
Return the "whole of it" interval set.
"""
return self.set_instantiator([self.int_utils.all()])
[docs] def interval(self, value_begin, begin_included, value_end, end_included):
"""
Directly create an interval set from the values
and the open/closed specs.
"""
return self.set_instantiator(
[
self.int_utils.interval(
value_begin,
begin_included,
value_end,
end_included,
)
]
)