#pragma once #include #include namespace mlx { template [[nodiscard]] constexpr T Mod(T x, T y) noexcept { if constexpr(std::is_floating_point_v) { if(!std::is_constant_evaluated()) return x - static_cast(x / y) * y; else return std::fmod(x, y); } return x % y; } template [[nodiscard]] constexpr T DegreeToRadian(T degrees) noexcept { return degrees * (Pi() / T(180.0)); } template [[nodiscard]] constexpr T RadianToDegree(T radians) noexcept { return radians * (T(180.0) / Pi()); } template [[nodiscard]] constexpr T Clamp(T value, T min, T max) noexcept { return std::max(std::min(value, max), min); } template [[nodiscard]] constexpr T Lerp(const T& from, const T& to, const T2& interpolation) noexcept { return static_cast(from + interpolation * (to - from)); } }