ci: tests for macOS on Gitlab CI
[nit.git] / lib / core / math.nit
index bdd7daa..a7eefbe 100644 (file)
@@ -126,9 +126,9 @@ redef class Int
 
        # 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
@@ -136,7 +136,7 @@ redef class Int
                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
@@ -169,6 +169,16 @@ redef class Int
                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
@@ -242,15 +252,15 @@ redef class Float
 
        # 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`.
@@ -410,6 +420,17 @@ fun inf: Float do return 1.0 / 0.0
 # ~~~
 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
@@ -524,11 +545,11 @@ redef class Sys
        end
 end
 
-# Computes the arc tangent given `x` and `y`.
+# Computes the arc tangent given `y` and `x`.
 #
 #     assert atan2(-0.0, 1.0) == -0.0
 #     assert atan2(0.0, 1.0) == 0.0
-fun atan2(x: Float, y: Float): Float `{ return atan2(x, y); `}
+fun atan2(y: Float, x: Float): Float `{ return atan2(y, x); `}
 
 # Approximate value of **pi**.
 fun pi: Float do return 3.14159265