restructure to use assoc-op