I agree that, given an efficient mapping-search, the "earlier takes precedence" can be implemented easily and efficiently.

It can be tricky to provide mapping-search as the primitive search/alter operation, depending on how the underlying map is implemented---suppose, for example, what if one wants thread-safety for mapping API (of course, srfi-146 doesn't require mutation of maps, and we don't need to worry about thread safety if we go with purely functional data structures.  And it is technically an erroneous situation when some other thread observes mutation even when linear-update API is used.  But some other thread might be watching, e.g. debugging or intrumenting, and we don't want to expose internally inconsistent state at any moment.)

I'm implementing srfi-146 on top of Gauche's built-in tree-map, and mapping-search is the one that seems challenging to implement efficiently *and* safely.