(0, pi/2) U (-pi, 0)
>>> transform(x, 2*x, domain)
(0, pi) U (-2*pi, 0)
>>> transform(x, x**2, domain)
(0, pi**2)
"""
if isinstance(set, Union):
return Union(transform_set(x, expr, arg) for arg in set.args)
if isinstance(set, Intersection):
return Intersection(transform_set(x, expr, arg) for arg in set.args)
z = Dummy('z', real=True)
f = Lambda(x, expr)
if isinstance(set, Interval):
# TODO: manage left_open and right_open better
left, right = f(set.left), f(set.right)
return Interval(Min(left, right), Max(left, right),
set.left_open, set.right_open)
if isinstance(set, FiniteSet):
return FiniteSet(map(f, set))