TODO: memoize ast-mutate by base and edit op