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