successor of x in c = the smallest element of c that is larger than x
��min {y | y in c . y > x}
predecessor of x in c = the largest element of c that is smaller than x
��max {y | y in c . y < x}

On Thu, 20 Apr 2023 at 21:08, Steffen M��rcker <merkste@web.de> wrote:
Dear Richard,

thanks for that additional piece. I'll put insert-<left/right> on my list of possible variants. I think we come back to naming after the initial port is done and everyone can play with it. Generally, I made the observation to better be careful with names since it's too easy to alienate other or trigger wrong assumptions.

New�� topic! (quote below)

Honestly, my knowledge of Haskell is rather limited and rusted. Hence, I am having difficulties understanding what exactly these operations with a sequence of elements. Can you give an example or some pseude/smalltalk code from your use-case and library?

Kind regards

Changing the subject a wee bit, there's an operation family
in my library, and I wonder how it would fit into Transducers?
To avoid bias, here's a specification in Haskell (for lists,
because I haven't had any luck installing Data.Witherable).

uccessorBy, predecessorBy :: (a -> a -> Ordering) -> a -> [a] -> a
successor, �� predecessor �� :: Ord a �� �� �� �� �� �� �� ��=> a -> [a] -> a

successor = successorBy compare

successorBy cmp x = minimumBy cmp . filter (\y -> cmp x y == LT)

predecessor = predecessorBy compare

predecessorBy cmp = successorBy (flip cmp)

The reason these operations exist is to pick neighbouring
elements in SortedCollections and SortedSets.�� But they make
*sense* for any Enumerable.�� So there are "generic"
definitions with orderrides for those two classes.

A filter + a reduce .�� Traditionally, a #select:thenFold:ifNone:
in order to avoid building an intermediate collection.�� That much
I see how to do with transducers.�� But you can't get the desired
override for #successor:[sortBlock:][ifNone:] by overriding
#select:thenFold:ifNone: in SortedCollection or SortedSet.�� So what
*should* one do?