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
instance Monad Vector where
return = Vector.singleton
v >>= f = Vector.concatMap f v
fail _ = Vector.empty
instance MonadPlus Vector where
mzero = Vector.empty
mplus = (++)
instance Monoid (Vector a) where
mempty = Vector.empty
mappend = (++)
instance Applicative Vector where
pure = Vector.singleton
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
instance Alternative Vector where
(<|>) = (++)
empty = Vector.empty
instance Foldable Vector where
foldl = Vector.foldl
foldr = Vector.foldr
foldl1 = Vector.foldl1
foldr1 = Vector.foldr1
instance Traversable Vector where
traverse f v
= Vector.fromListN (Vector.length v) <$> traverse f (Vector.toList v)