from __future__ import print_function, division

from sympy import Basic

new = Basic.__new__

def assoc(d, k, v):
    d = d.copy()
    d[k] = v
    return d

basic_fns = {'op': type,
             'new': Basic.__new__,
             'leaf': lambda x: not isinstance(x, Basic) or x.is_Atom,
             'children': lambda x: x.args}

expr_fns = assoc(basic_fns, 'new', lambda op, *args: op(*args))
