{-# LANGUAGE Haskell2010, FlexibleInstances, Trustworthy #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Data.Monoid.Instances.CharVector where
import Data.String (IsString(fromString))
import qualified Data.Vector as Vector
import Data.Monoid.Textual (TextualMonoid(..))
instance IsString (Vector.Vector Char) where
fromString = Vector.fromList
instance TextualMonoid (Vector.Vector Char) where
singleton = Vector.singleton
splitCharacterPrefix t = if Vector.null t then Nothing else Just (Vector.unsafeHead t, Vector.unsafeTail t)
characterPrefix = (Vector.!? 0)
map = Vector.map
concatMap = Vector.concatMap
toString = const Vector.toList
any = Vector.any
all = Vector.all
foldl = const Vector.foldl
foldl' = const Vector.foldl'
foldr = const Vector.foldr
scanl = Vector.scanl
scanl1 f v | Vector.null v = Vector.empty
| otherwise = Vector.scanl1 f v
scanr = Vector.scanr
scanr1 f v | Vector.null v = Vector.empty
| otherwise = Vector.scanr1 f v
mapAccumL f a0 t = (a', Vector.reverse $ Vector.fromList l')
where (a', l') = Vector.foldl fc (a0, []) t
fc (a, l) c = (:l) <$> f a c
mapAccumR f a0 t = (a', Vector.fromList l')
where (a', l') = Vector.foldr fc (a0, []) t
fc c (a, l) = (:l) <$> f a c
takeWhile _ = Vector.takeWhile
dropWhile _ = Vector.dropWhile
break _ = Vector.break
span _ = Vector.span
spanMaybe s0 _ft fc v = case Vector.ifoldr g Left v s0
of Left s' -> (v, Vector.empty, s')
Right (i, s') | (prefix, suffix) <- Vector.splitAt i v -> (prefix, suffix, s')
where g i c cont s | Just s' <- fc s c = cont s'
| otherwise = Right (i, s)
spanMaybe' s0 _ft fc v = case Vector.ifoldr' g Left v s0
of Left s' -> (v, Vector.empty, s')
Right (i, s') | (prefix, suffix) <- Vector.splitAt i v -> (prefix, suffix, s')
where g i c cont s | Just s' <- fc s c = seq s' (cont s')
| otherwise = Right (i, s)
find = Vector.find
elem = Vector.elem
{-# INLINE all #-}
{-# INLINE any #-}
{-# INLINE break #-}
{-# INLINE characterPrefix #-}
{-# INLINE concatMap #-}
{-# INLINE dropWhile #-}
{-# INLINE elem #-}
{-# INLINE find #-}
{-# INLINE foldl #-}
{-# INLINE foldl' #-}
{-# INLINE foldr #-}
{-# INLINE map #-}
{-# INLINE mapAccumL #-}
{-# INLINE mapAccumR #-}
{-# INLINE scanl #-}
{-# INLINE scanl1 #-}
{-# INLINE scanr #-}
{-# INLINE scanr1 #-}
{-# INLINE singleton #-}
{-# INLINE span #-}
{-# INLINE spanMaybe #-}
{-# INLINE spanMaybe' #-}
{-# INLINE splitCharacterPrefix #-}
{-# INLINE takeWhile #-}