-- | Utility functions
module System.FTDI.Utils where

import Data.Bits

genFromEnum :: (Enum e, Num n) => e -> n
genFromEnum :: forall e n. (Enum e, Num n) => e -> n
genFromEnum = Int -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> n) -> (e -> Int) -> e -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Int
forall a. Enum a => a -> Int
fromEnum

orBits :: (Num a, Bits a) => [a] -> a
orBits :: forall a. (Num a, Bits a) => [a] -> a
orBits = (a -> a -> a) -> a -> [a] -> a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> a -> a
forall a. Bits a => a -> a -> a
(.|.) a
0

andBits :: (Num a, Bits a) => [a] -> a
andBits :: forall a. (Num a, Bits a) => [a] -> a
andBits = (a -> a -> a) -> a -> [a] -> a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> a -> a
forall a. Bits a => a -> a -> a
(.&.) (a -> [a] -> a) -> a -> [a] -> a
forall a b. (a -> b) -> a -> b
$ a -> a
forall a. Bits a => a -> a
complement a
0

clamp :: (Bounded a, Ord a) => a -> a
clamp :: forall a. (Bounded a, Ord a) => a -> a
clamp = a -> a -> a
forall a. Ord a => a -> a -> a
atLeast a
forall a. Bounded a => a
minBound (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a -> a
forall a. Ord a => a -> a -> a
atMost a
forall a. Bounded a => a
maxBound

atLeast :: Ord a => a -> a -> a
atLeast :: forall a. Ord a => a -> a -> a
atLeast = a -> a -> a
forall a. Ord a => a -> a -> a
max

atMost :: Ord a => a -> a -> a
atMost :: forall a. Ord a => a -> a -> a
atMost = a -> a -> a
forall a. Ord a => a -> a -> a
min

divRndUp :: Integral a => a -> a -> a
divRndUp :: forall a. Integral a => a -> a -> a
divRndUp a
x a
y = let (a
d, a
m) = a
x a -> a -> (a, a)
forall a. Integral a => a -> a -> (a, a)
`divMod` a
y
               in a
d a -> a -> a
forall a. Num a => a -> a -> a
+ if a
m a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0 then a
1 else a
0

between :: Ord a => a -> a -> a -> Bool
between :: forall a. Ord a => a -> a -> a -> Bool
between a
lo a
hi a
x = (a
lo a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
x) Bool -> Bool -> Bool
&& (a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
hi)