{-# LANGUAGE
CPP
, UnicodeSyntax
#-}
module Data.Bitstream.Fusion
( genericLength
, genericTake
, genericDrop
, genericIndex
, genericReplicate
, genericUnfoldrN
, genericFindIndex
, genericIndexed
)
where
import qualified Data.Bitstream.Fusion.Monadic as M
#if MIN_VERSION_vector(0,11,0)
import Data.Bifunctor (first)
import Data.Vector.Fusion.Bundle as B
import Data.Vector.Fusion.Bundle.Size
#else
import Data.Vector.Fusion.Stream
#endif
import Prelude hiding (replicate)
{-# INLINE genericLength #-}
#if MIN_VERSION_vector(0,11,0)
genericLength ∷ Num n ⇒ Bundle v α → n
genericLength = fromIntegral . B.length
#else
genericLength ∷ Num n ⇒ Stream α → n
genericLength = unId ∘ M.genericLength
#endif
{-# INLINE genericTake #-}
#if MIN_VERSION_vector(0,11,0)
genericTake ∷ Integral n ⇒ n → Bundle v α → Bundle v α
genericTake n = inplace (M.genericTake n) toMax
#else
genericTake ∷ Integral n ⇒ n → Stream α → Stream α
genericTake = M.genericTake
#endif
{-# INLINE genericDrop #-}
#if MIN_VERSION_vector(0,11,0)
genericDrop ∷ Integral n ⇒ n → Bundle v α → Bundle v α
genericDrop n = inplace (M.genericDrop n) toMax
#else
genericDrop ∷ Integral n ⇒ n → Stream α → Stream α
genericDrop = M.genericDrop
#endif
{-# INLINE genericIndex #-}
#if MIN_VERSION_vector(0,11,0)
genericIndex ∷ (Integral n, Show n) ⇒ Bundle v α → n → α
genericIndex s i = s B.!! (fromIntegral i)
#else
genericIndex ∷ (Integral n, Show n) ⇒ Stream α → n → α
genericIndex s = unId ∘ M.genericIndex s
#endif
{-# INLINE genericReplicate #-}
#if MIN_VERSION_vector(0,11,0)
genericReplicate ∷ Integral n ⇒ n → α → Bundle v α
genericReplicate = B.replicate . fromIntegral
#else
genericReplicate ∷ Integral n ⇒ n → α → Stream α
genericReplicate = M.genericReplicate
#endif
{-# INLINE genericUnfoldrN #-}
#if MIN_VERSION_vector(0,11,0)
genericUnfoldrN ∷ Integral n ⇒ n → (β → Maybe (α, β)) → β → Bundle v α
genericUnfoldrN = B.unfoldrN . fromIntegral
#else
genericUnfoldrN ∷ Integral n ⇒ n → (β → Maybe (α, β)) → β → Stream α
genericUnfoldrN = M.genericUnfoldrN
#endif
{-# INLINE genericFindIndex #-}
#if MIN_VERSION_vector(0,11,0)
genericFindIndex ∷ Integral n ⇒ (α → Bool) → Bundle v α → Maybe n
genericFindIndex f = fmap fromIntegral . B.findIndex f
#else
genericFindIndex ∷ Integral n ⇒ (α → Bool) → Stream α → Maybe n
genericFindIndex f = unId ∘ M.genericFindIndex f
#endif
{-# INLINE genericIndexed #-}
#if MIN_VERSION_vector(0,11,0)
genericIndexed ∷ Integral n ⇒ Bundle v α → Bundle v (n, α)
genericIndexed = fmap (first fromIntegral) . B.indexed
#else
genericIndexed ∷ Integral n ⇒ Stream α → Stream (n, α)
genericIndexed = M.genericIndexed
#endif