{-# LANGUAGE NoImplicitPrelude
           , UnicodeSyntax
  #-}

module System.FTDI.Utils where

-------------------------------------------------------------------------------
-- Imports
-------------------------------------------------------------------------------

-- base
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
                                 )

-- base-unicode-symbols
import Data.Bool.Unicode         ( (∧) )
import Data.Eq.Unicode           ( (â¢) )
import Data.Ord.Unicode          ( (â¤) )
import Data.Function.Unicode     ( (∘) )


-------------------------------------------------------------------------------
-- Utility functions
-------------------------------------------------------------------------------

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