Skip to content

Rework: protocol division requirements #115

Open

Description

@oscbyspro

So I'm working on (#68) and (#69). The most straightforward solution results in protocol requirements with Optional<Fallible<T>> return types (#95). It works, and it seems viable, but I wouldn't call it elegant. I have some other ideas, however. One option is deriving safe operations from unsafe protocol requirements returning T. Another option, that may or may not be viable, is deriving division operations from a safe-but-unsigned requirement. It depends on how well the derived same-size-but-signed operations can be optimized. Imagine something like this:

protocol UnsignedInteger {
    static func quotient(_ dividend: Natural<Self>, by divisor: Nonzero<Self>) -> Self
}

Activity

  1. oscbyspro commented on Oct 13, 2024

    @oscbyspro
    OwnerAuthor

    It doesn't seem viable to derive the signed division from an unsigned requirement. Sad, but understandable.

  2. oscbyspro commented on Oct 13, 2024

    @oscbyspro
    OwnerAuthor

    Tangentially, one reason (although I'm not sure it applies here) to derive safe Guarantee-like methods from unsafe protocol requirements is that all Guarantee type conversions are consuming, so you can't really use them to wrap things you've borrowed. Using an unsafe non-Guarantee parameter is basically equivalent to hoisting the borrowing effect, if that makes sense. I don't think it matters much in the case of integers (since copy is trivial or cheap), but it's something I've noticed while writing methods using the Guarantee approach.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    additionoh, so shiny!brrrsuch code, much wowmaybeto do, or not to do?subtractionhuh? where did it go?

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions