"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);
}