Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create FS-1135-map-binary-search.md #734

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open

Conversation

reinux
Copy link

@reinux reinux commented Apr 20, 2023

@dsyme
Copy link
Contributor

dsyme commented Jun 12, 2024

@KevinRansom @vzarytovskii @abelbraaksma Comments on this please?

@T-Gro
Copy link
Contributor

T-Gro commented Jun 17, 2024

@reinux :

I am still thinking of a better self-explainable API, I don't think a tuple of 3 with same types is best. Even though the ordering (previous,match,next) is likely the most natural one here.

Just to show another proposal, I have tried to DU-model the outcomes, but I do not think it is any better to your proposal here. The number of possible combinations is an inherent part of binary search if we want this to be a primitive supporting all sorts of scenarios.

type Node<'TKey,'TValue> = (struct ('TKey * 'TValue))

[<Struct>]
type MapPosition<'a,'b> =  
    | Between of below:Node<'a,'b> * above:Node<'a,'b>
    | AtMinimum of above:Node<'a,'b>
    | AtMaximum of below:Node<'a,'b>
    | MapWasEMpty

[<Struct>]
type BinarySearchResult<'a,'b> =
    | ExactMatch of hit:Node<'a,'b> * position:MapPosition<'a,'b> 
    | NotFound of  position:MapPosition<'a,'b> 

@Martin521
Copy link
Contributor

Martin521 commented Aug 13, 2024

I like the functionality and the API.
I am not sure about the name. "Binary search" is a well defined algorithm for arrays with a single return value.
Just Map.search? Map.tryFindWithNeighbors?

@reinux
Copy link
Author

reinux commented Sep 21, 2024

I like the functionality and the API. I am not sure about the name. "Binary search" is a well defined algorithm for arrays with a single return value. Just Map.search? Map.tryFindWithNeighbors?

The more I think about it, the more I'm liking Map.search. Even if I could validly argue that it's a special case of binary search (and I'm starting to have doubts), you probably wouldn't be the only one raising an eyebrow.

search is a nice, short name, and the return type, whatever we end up landing on, will do a fine job describing what it does anyway.

As for the return type, I think the only option we haven't explored yet is a single-case union with named parameters:

type MapSearchResult<'k, 'v> =
  MapSearchResult of left: ('k, 'v) option * exact: ('k, 'v) option * right: ('k, 'v) option

This would effectively be the same as the tuple version, except that we'd be trading conciseness with some IDE assistance.

I'm likewise unsure whether this is the best approach either.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants