module System.FTDI.Utils where
import Data.Bool ( Bool )
import Data.Bits ( Bits, (.|.), (.&.), complement )
import Data.Function ( ($) )
import Data.List ( foldr )
import Data.Ord ( Ord, min, max )
import Prelude ( Enum, Bounded, minBound, maxBound
, Num, (+), Integral
, fromEnum, fromInteger, fromIntegral
, divMod
)
import Data.Bool.Unicode ( (∧) )
import Data.Eq.Unicode ( (≢) )
import Data.Ord.Unicode ( (≤) )
import Data.Function.Unicode ( (∘) )
genFromEnum ∷ (Enum e, Num n) ⇒ e → n
genFromEnum = fromIntegral ∘ fromEnum
orBits ∷ Bits α ⇒ [α] → α
orBits = foldr (.|.) 0
andBits ∷ Bits α ⇒ [α] → α
andBits = foldr (.&.) $ complement 0
clamp ∷ (Bounded α, Ord α) ⇒ α → α
clamp = atLeast minBound ∘ atMost maxBound
atLeast ∷ Ord α ⇒ α → α → α
atLeast = max
atMost ∷ Ord α ⇒ α → α → α
atMost = min
divRndUp ∷ Integral α ⇒ α → α → α
divRndUp x y = let (d, m) = x `divMod` y
in d + if m ≢ 0 then 1 else 0
between ∷ Ord α ⇒ α → α → α → Bool
between lo hi x = lo ≤ x ∧ x ≤ hi