//
//  Clamped.swift
//  secant-testnet
//
//  Created by Francisco Gindre on 10/20/21.
//
// credits: https://iteo.medium.com/swift-property-wrappers-how-to-use-them-right-77095817d1b
import Foundation

/**
Limits a value to an enclosing range
*/
@propertyWrapper
public struct Clamped<Value: Comparable> {
    private var value: Value
    private let range: ClosedRange<Value>
    public var wrappedValue: Value {
        get { value }
        set { value = clamp(newValue, using: range) }
    }

    init(wrappedValue: Value, _ range: ClosedRange<Value>) {
        self.value = wrappedValue
        self.range = range
        
        value = clamp(wrappedValue, using: range)
    }
    
    private func clamp(_ value: Value, using range: ClosedRange<Value>) -> Value {
        min(range.upperBound, max(range.lowerBound, value))
    }
}
