effects are now map-like (implement .get and .assoc)