"""
Reader combined with number.
"""
from numbers import Number
from types import LambdaType
from ..basereader import BaseReader
[docs]
class Combined:
"""
A reader combined with a number.
"""
n: Number
r: BaseReader
op: LambdaType
def __init__(self, n, r, op, descop = '|'):
self.n = n
self.r = r
self.op = op
assert isinstance(n, Number)
assert isinstance(r, BaseReader)
self.name = f'NumCombined({self.r} {descop} {self.n})'
[docs]
@staticmethod
def add(n, r):
return Combined(n, r, lambda x: n + x, '+')
[docs]
@staticmethod
def mul(n, r):
return Combined(n, r, lambda x: n * x, '*')
[docs]
@staticmethod
def sub(n, r):
return Combined(n, r, lambda x: x - n, '-')
[docs]
@staticmethod
def div(n, r):
return Combined(n, r, lambda x: x / n, '/')
[docs]
def __getattr__(self, attr):
"""
Forward all other method calls and attributes to reader.
"""
return getattr(self.r, attr)
[docs]
def get_variables_interpolated(self, variables, *args, **kwargs):
assert set(variables).issubset(self.r.variables), f"{vars} is not a subset of variables in {self.r}"
env, env_profiles = self.r.get_variables_interpolated(variables, *args, **kwargs)
variables = [
var for var in env.keys() if var not in ['x', 'y', 'z', 'time']
]
for var in variables:
env[var] = self.op(env[var])
if env_profiles is not None:
variables = [
var for var in env_profiles.keys() if var not in ['x', 'y', 'z', 'time']
]
for var in variables:
env_profiles[var] = self.op(env_profiles[var])
return env, env_profiles