# Is self a prime number ?
#
- # assert 3.is_prime
- # assert not 1.is_prime
- # assert not 12.is_prime
+ # assert 3.is_prime
+ # assert not 1.is_prime
+ # assert not 15.is_prime
fun is_prime: Bool
do
if self == 2 then
else if self <= 1 or self.is_even then
return false
end
- for i in [3..self.sqrt[ do
+ for i in [3..self.sqrt] do
if self % i == 0 then return false
end
return true
end
return res
end
+
+ # Is `self` a power of two ?
+ #
+ # ~~~nit
+ # assert not 3.is_pow2
+ # assert 2.is_pow2
+ # assert 1.is_pow2
+ # assert not 0.is_pow2
+ # ~~~
+ fun is_pow2: Bool do return self != 0 and (self & self - 1) == 0
end
redef class Byte
# Returns `self` raised at `e` power.
#
- # #assert 2.0.pow(0.0) == 1.0
- # #assert 2.0.pow(3.0) == 8.0
- # #assert 0.0.pow(9.0) == 0.0
+ # assert 2.0.pow(0.0) == 1.0
+ # assert 2.0.pow(3.0) == 8.0
+ # assert 0.0.pow(9.0) == 0.0
fun pow(e: Float): Float `{ return pow(self, e); `}
# Natural logarithm of `self`.
#
# assert 0.0.log.is_inf == -1
- # #assert 1.0.log == 0.0
+ # assert 1.0.log == 0.0
fun log: Float `{ return log(self); `}
# Logarithm of `self` to base `base`.
# ~~~
fun nan: Float do return 0.0 / 0.0
+redef class Comparable
+ # Constraint `self` within `[min..max]`
+ #
+ # assert 1.clamp(5, 10) == 5
+ # assert 7.clamp(5, 10) == 7
+ # assert 15.clamp(5, 10) == 10
+ # assert 1.5.clamp(1.0, 2.0) == 1.5
+ # assert "a".clamp("b", "c") == "b"
+ fun clamp(min, max: OTHER): OTHER do return self.max(min).min(max)
+end
+
redef class Collection[ E ]
# Return a random element form the collection
# There must be at least one element in the collection