module Iri.Vector where

import Data.Vector
import Iri.Prelude hiding (length, null)

{-# INLINE intercalate #-}
intercalate :: (Monoid monoid) => (element -> monoid) -> monoid -> Vector element -> monoid
intercalate :: forall monoid element.
Monoid monoid =>
(element -> monoid) -> monoid -> Vector element -> monoid
intercalate element -> monoid
project monoid
separator Vector element
vector =
  if Vector element -> Bool
forall a. Vector a -> Bool
null Vector element
vector
    then monoid
forall a. Monoid a => a
mempty
    else element -> monoid
project (Vector element -> Int -> element
forall a. Vector a -> Int -> a
unsafeIndex Vector element
vector Int
0) monoid -> monoid -> monoid
forall a. Semigroup a => a -> a -> a
<> Int -> monoid
iterate Int
1
  where
    vectorLength :: Int
vectorLength =
      Vector element -> Int
forall a. Vector a -> Int
length Vector element
vector
    iterate :: Int -> monoid
iterate !Int
index =
      if Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
vectorLength
        then monoid
separator monoid -> monoid -> monoid
forall a. Semigroup a => a -> a -> a
<> element -> monoid
project (Vector element -> Int -> element
forall a. Vector a -> Int -> a
unsafeIndex Vector element
vector Int
index) monoid -> monoid -> monoid
forall a. Semigroup a => a -> a -> a
<> Int -> monoid
iterate (Int -> Int
forall a. Enum a => a -> a
succ Int
index)
        else monoid
forall a. Monoid a => a
mempty