    -- Extra bits stuff
    module Foundation.Bits
        ( (.<<.)
        , (.>>.)
        , Bits(..)
        , alignRoundUp
        , alignRoundDown
        ) where

    import Basement.Compat.Base
    import Foundation.Numerical
    import Data.Bits

    -- | Unsafe Shift Left Operator
    (.<<.) :: Bits a => a -> Int -> a
    (.<<.) = unsafeShiftL

    -- | Unsafe Shift Right Operator
    (.>>.) :: Bits a => a -> Int -> a
    (.>>.) = unsafeShiftR

    -- | Round up (if needed) to a multiple of @alignment@ closst to @m@
    --
    -- @alignment@ needs to be a power of two
    --
    -- alignRoundUp 16 8 = 16
    -- alignRoundUp 15 8 = 16
    alignRoundUp :: Int -- ^ Number to Align
                 -> Int -- ^ Alignment (power of 2)
                 -> Int
    alignRoundUp m alignment = (m + (alignment-1)) .&. complement (alignment-1)

    -- | Round down (if needed) to a multiple of @alignment@ closest to @m@
    --
    -- @alignment@ needs to be a power of two
    --
    -- > alignRoundDown 15 8 = 8
    -- > alignRoundDown 8 8  = 8
    alignRoundDown :: Int -- ^ Number to Align
                   -> Int -- ^ Alignment (power of 2)
                   -> Int
    alignRoundDown m alignment = m .&. complement (alignment-1)