strict-containers-0.1: src/Data/Strict/Vector/Internal.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Strict.Vector.Internal where
import Data.Vector as L
import Data.Strict.Vector.Autogen as S
import Data.Binary
import Data.Foldable.WithIndex
import Data.Functor.WithIndex
import Data.Traversable.WithIndex
import Data.Semigroup (Semigroup (..)) -- helps with compatibility
import Data.Strict.Classes
import Data.Vector.Binary
instance Strict (L.Vector k) (S.Vector k) where
toStrict = S.fromList . L.toList
toLazy = L.fromList . S.toList
{-# INLINE toStrict #-}
{-# INLINE toLazy #-}
-- code copied from indexed-traversable-instances
instance FunctorWithIndex Int S.Vector where
imap = S.imap
{-# INLINE imap #-}
instance FoldableWithIndex Int S.Vector where
ifoldr = S.ifoldr
{-# INLINE ifoldr #-}
ifoldl = S.ifoldl . flip
{-# INLINE ifoldl #-}
ifoldr' = S.ifoldr'
{-# INLINE ifoldr' #-}
ifoldl' = S.ifoldl' . flip
{-# INLINE ifoldl' #-}
instance TraversableWithIndex Int S.Vector where
itraverse f v =
let !n = S.length v in S.fromListN n <$> itraverse f (S.toList v)
{-# INLINE itraverse #-}
-- code copied from vector-binary-instances
instance Binary a => Binary (S.Vector a) where
put = genericPutVector
get = genericGetVector
{-# INLINE get #-}