module Language.Lexer.Tlex.Data.Bits (
    maxBitSize,
) where

import           Language.Lexer.Tlex.Prelude

import qualified Data.Bits                   as Bits


maxBitSize :: Bits.FiniteBits a => Ord a => Num a => a -> Int
maxBitSize :: a -> Int
maxBitSize a
n = Int -> a -> Int
go Int
1 a
2 where
    go :: Int -> a -> Int
go Int
i a
m
        | a
n a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
m                     = Int
i
        | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= a -> Int
forall b. FiniteBits b => b -> Int
Bits.finiteBitSize a
n = Int
i
        | Bool
otherwise                 = Int -> a -> Int
go
            do Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
            do a
m a -> a -> a
forall a. Num a => a -> a -> a
* a
2