// Copyright © 2024 Rangeproof Pty Ltd. All rights reserved.

import Foundation

public extension CGFloat {
    var square: CGFloat { self * self }
    
    func clamp(_ minValue: CGFloat, _ maxValue: CGFloat) -> CGFloat {
        return Swift.max(minValue, Swift.min(maxValue, self))
    }
    
    func clamp01() -> CGFloat {
        return clamp(0, 1)
    }
    
    func lerp(_ minValue: CGFloat, _ maxValue: CGFloat) -> CGFloat {
        return (minValue * (1 - self)) + (maxValue * self)
    }
    
    func inverseLerp(_ minValue: CGFloat, _ maxValue: CGFloat, shouldClamp: Bool = false) -> CGFloat {
        let result: CGFloat = ((self - minValue) / (maxValue - minValue))
        
        return (shouldClamp ? result.clamp01() : result)
    }
    
    func fuzzyEquals(_ other: CGFloat, tolerance: CGFloat = 0.001) -> Bool {
        return abs(self - other) < tolerance
    }
}