content: {-# LANGUAGE CPP #-}
  {-# OPTIONS_HADDOCK prune #-}
  
  #ifndef BITVEC_THREADSAFE
  -- |
  -- Module:      Data.Bit
  -- Copyright:   (c) 2019-2022 Andrew Lelechenko, 2012-2016 James Cook
  -- Licence:     BSD3
  -- Maintainer:  Andrew Lelechenko <andrew.lelechenko@gmail.com>
  --
  -- This module exposes an interface with non-thread-safe writes and flips.
  -- Additionally, concurrently modifying non-intersecting slices of the same underlying array
  -- may lead to unexpected results.
  -- Consider using "Data.Bit.ThreadSafe", which is thread-safe, but slower
  -- (usually 10-20%, up to 50% for short vectors).
  --
  -- @since 0.1
  module Data.Bit
  #else
  -- |
  -- Module:      Data.Bit.ThreadSafe
  -- Copyright:   (c) 2019-2022 Andrew Lelechenko, 2012-2016 James Cook
  -- Licence:     BSD3
  -- Maintainer:  Andrew Lelechenko <andrew.lelechenko@gmail.com>
  --
  -- This module exposes an interface with thread-safe writes and flips.
  -- Additionally, concurrently modifying non-intersecting slices of the same underlying array
  -- works as expected. However, operations that affect multiple elements are not
  -- guaranteed to be atomic.
  -- Consider using "Data.Bit", which is faster
  -- (usually 10-20%, up to 50% for short vectors), but not thread-safe.
  --
  -- @since 1.0
  module Data.Bit.ThreadSafe
  #endif
    ( Bit(..)
    , U.Vector(BitVec)
    , U.MVector(BitMVec)
  
    , unsafeFlipBit
    , flipBit
  
    -- * Immutable conversions
    , castFromWords
    , castToWords
    , cloneToWords
  
    , castFromWords8
    , castToWords8
    , cloneToWords8
  
    , cloneFromByteString
    , cloneToByteString
  
    -- * Immutable operations
    , zipBits
    , mapBits
    , invertBits
    , reverseBits
    , bitIndex
    , nthBitIndex
    , countBits
    , listBits
    , selectBits
    , excludeBits
  
    -- * Mutable conversions
    , castFromWordsM
    , castToWordsM
    , cloneToWordsM
  
    -- * Mutable operations
    , zipInPlace
    , mapInPlace
    , invertInPlace
    , reverseInPlace
    , selectBitsInPlace
    , excludeBitsInPlace
  
    -- * Binary polynomials
    , F2Poly
    , unF2Poly
    , toF2Poly
    , gcdExt
    ) where
  
  import Prelude hiding (and, or)
  import qualified Data.Vector.Unboxed as U
  
  #ifndef BITVEC_THREADSAFE
  import Data.Bit.F2Poly
  import Data.Bit.Immutable
  import Data.Bit.Internal
  import Data.Bit.Mutable
  #else
  import Data.Bit.F2PolyTS
  import Data.Bit.ImmutableTS
  import Data.Bit.InternalTS
  import Data.Bit.MutableTS
  #endif
  