module Bits ( cLog ) where

import           Data.Bits (FiniteBits, countTrailingZeros, popCount)
import           Data.Int  (Int64)

cLog :: FiniteBits a => a -> Maybe Int64
cLog :: forall a. FiniteBits a => a -> Maybe Int64
cLog a
n | a -> Int
forall a. Bits a => a -> Int
popCount a
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = Int64 -> Maybe Int64
forall a. a -> Maybe a
Just (Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral(Int -> Int64) -> Int -> Int64
forall a b. (a -> b) -> a -> b
$a -> Int
forall b. FiniteBits b => b -> Int
countTrailingZeros a
n) | Bool
otherwise = Maybe Int64
forall a. Maybe a
Nothing