a good start at swap+idemp