{-# LANGUAGE CPP #-}
{-# LANGUAGE NoImplicitPrelude #-}
-- |
-- Module:       $HEADER$
-- Description:  Internally used utilities.
-- Copyright:    (c) 2015, Peter Trško
-- License:      BSD3
--
-- Stability:    unstable
-- Portability:  CPP, NoImplicitPrelude
module Data.NumberLength.Internal
  where

import Prelude (error)

#if MIN_VERSION_base(4,7,0)
import Data.Bits (FiniteBits(finiteBitSize))
#else
import Data.Bits (Bits(bitSize))
#endif

import Data.Function (($))
import Data.Monoid ((<>))
import Data.Word (Word)
import Text.Show (Show(show))


-- | Returns one of its arguments, depending on bit size of 'Word' type on
-- current hardware.
either32or64
    :: a
    -- ^ Used in case when 'Word' is 32bit long.
    -> a
    -- ^ Used in case when 'Word' is 64bit long.
    -> a
either32or64 on32bit on64bit = case wordSize (0 :: Word) of
    32 -> on32bit
    64 -> on64bit
    bs -> error $ "Data.NumberLength.either32or64: " <> show bs
        <> ": System uses Word size not supported by this library."
  where
    wordSize =
#if MIN_VERSION_base(4,7,0)
        finiteBitSize
#else
        bitSize
#endif
{-# INLINE either32or64 #-}