{-# LANGUAGE TypeFamilies #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Vector.Instances
-- Copyright : (c) Edward Kmett 2010
-- License : BSD3
-- Maintainer : ekmett@gmail.com
-- Stability : experimental
-- Portability : portable
--
-----------------------------------------------------------------------------
module Data.Vector.Instances () where
import Prelude hiding ((++), drop, length)
import Control.Applicative
import Control.Monad
import Data.Semigroup
import Data.Key
import Data.Functor.Bind
import Data.Functor.Extend
import Data.Functor.Plus
import Data.Foldable (Foldable(..))
import Data.Traversable (Traversable(..))
import Data.Pointed
import Data.Monoid
import qualified Data.Vector as Vector
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Fusion.Stream as Stream
import Data.Vector.Fusion.Stream.Size
import Data.Vector (Vector,(++),drop,length,imap,ifoldr, ifoldl, izipWith,(!?),(//), generate)
import qualified Data.Vector as Vector
instance Functor Vector where
fmap = Vector.map
{-# INLINE fmap #-}
type instance Key Vector = Int
instance Keyed Vector where
mapWithKey = imap
{-# INLINE mapWithKey #-}
instance Zip Vector where
zipWith = Vector.zipWith
{-# INLINE zipWith #-}
instance ZipWithKey Vector where
zipWithKey = Vector.izipWith
{-# INLINE zipWithKey #-}
instance Indexable Vector where
index = (!)
{-# INLINE index #-}
instance Lookup Vector where
lookup = flip (!?)
{-# INLINE lookup #-}
instance Adjustable Vector where
adjust f n v = case v !? n of
Just a -> v // [(n, f a)]
Nothing -> v
{-# INLINE adjust #-}
replace n a v = v // [(n,a)]
{-# INLINE replace #-}
instance FoldableWithKey Vector where
foldrWithKey = ifoldr
{-# INLINE foldrWithKey #-}
foldlWithKey = ifoldl
{-# INLINE foldlWithKey #-}
instance Apply Vector where
fs <.> as =
G.unstream $ Stream.sized results (Exact n)
where
n = Vector.length fs * Vector.length as
results = Stream.concatMap body $ G.stream fs
body f = Stream.map f $ G.stream as
{-# INLINE (<.>) #-}
instance Pointed Vector where
point = Vector.singleton
{-# INLINE point #-}
instance Applicative Vector where
pure = Vector.singleton
{-# INLINE pure #-}
fs <*> as =
G.unstream $ Stream.sized results (Exact n)
where
n = Vector.length fs * Vector.length as
results = Stream.concatMap body $ G.stream fs
body f = Stream.map f $ G.stream as
{-# INLINE (<*>) #-}
instance Bind Vector where
v >>- f = Vector.concatMap f v
{-# INLINE (>>-) #-}
instance Semigroup (Vector a) where
(<>) = (++)
{-# INLINE (<>) #-}
instance Monad Vector where
return = Vector.singleton
{-# INLINE return #-}
v >>= f = Vector.concatMap f v
{-# INLINE (>>=) #-}
fail _ = Vector.empty
{-# INLINE fail #-}
instance MonadPlus Vector where
mzero = Vector.empty
{-# INLINE mzero #-}
mplus = (++)
{-# INLINE mplus #-}
instance Alt Vector where
(<!>) = (++)
{-# INLINE (<!>) #-}
instance Plus Vector where
zero = Vector.empty
{-# INLINE zero #-}
instance Alternative Vector where
(<|>) = (++)
{-# INLINE (<|>) #-}
empty = Vector.empty
{-# INLINE empty #-}
instance Foldable Vector where
foldl = Vector.foldl
{-# INLINE foldl #-}
foldr = Vector.foldr
{-# INLINE foldr #-}
foldl1 = Vector.foldl1
{-# INLINE foldl1 #-}
foldr1 = Vector.foldr1
{-# INLINE foldr1 #-}
instance Traversable Vector where
traverse f v
= Vector.fromListN (Vector.length v) <$> traverse f (Vector.toList v)
{-# INLINE traverse #-}
instance TraversableWithKey Vector where
traverseWithKey f v
= Vector.fromListN (Vector.length v) <$> traverseWithKey f (Vector.toList v)
{-# INLINE traverseWithKey #-}
instance Extend Vector where
duplicate v = generate (length v) (`drop` v)
{-# INLINE duplicate #-}
extend f v = generate (length v) (\n -> f (drop n v))
{-# INLINE extend #-}