-- | 'traverseS': traverse and then asum on the result.
-- This is potentially more general in comparison to traverseJ.
traverseS :: (Applicative f, Traversable t, Alternative g)
          => (a -> f (g b)) -> t a -> f (g b)
traverseS = fmap asum .: traverse
traverseS :: (Applicative f, Traversable t, Alternative g)
          => (a -> f (g b)) -> t a -> f (g b)
traverseS = fmap asum .: traverse
traverseS = fmap asum .: traverse