----------------------------------------------------------------------------- -- | -- 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 ((++)) import Control.Applicative import Control.Monad import Data.Foldable (Foldable(..)) import Data.Traversable (Traversable(..)) 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, (++)) instance Functor Vector where fmap = Vector.map {-# INLINE fmap #-} 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 Monoid (Vector a) where mempty = Vector.empty {-# INLINE mempty #-} mappend = (++) {-# INLINE mappend #-} 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 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 #-}