    "Abstraction of numeric types like `Integer` that may be
     represented as a sequence of bits, and may be the subject
     of bitwise operations."
    see (`class Integer`)
    by ("Stef")
    shared interface Binary<Other> of Other
        given Other satisfies Binary<Other> {

        "The binary complement of this sequence of bits."
        shared formal Other not;

        "The number of bits (0 or 1) that this sequence of bits can hold."
        shared formal Integer size;

        "Performs a left logical shift. Sign is not preserved. Padded with zeros."
        shared formal Other leftLogicalShift(Integer shift);

        "Performs a right logical shift. Sign is not preserved. Padded with zeros."
        shared formal Other rightLogicalShift(Integer shift);

        "Performs a right arithmetic shift. Sign is preserved. Padded with zeros."
        shared formal Other rightArithmeticShift(Integer shift);

        "Performs a logical AND operation."
        shared formal Other and(Other other);

        "Performs a logical inclusive OR operation."
        shared formal Other or(Other other);

        "Performs a logical exclusive OR operation."
        shared formal Other xor(Other other);

        "Retrieves a given bit from this bit sequence. Bits are indexed from
         right to left."
        shared formal Boolean get(Integer index);

        "Returns a new number with the given bit set to the given value.
         Bits are indexed from right to left."
        shared formal Other set(Integer index, Boolean bit = true);

        "Returns a new number with the given bit set to 0.
         Bits are indexed from right to left."
        shared default Other clear(Integer index){
            return set(index, false);
        }

        "Returns a new number with the given bit flipped to its opposite value.
         Bits are indexed from right to left."
        shared formal Other flip(Integer index);
    }