    {-# 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