partitionA :: Applicative f => (a -> f Bool) -> [a] -> f ([a], [a])
partitionA p =
  fmap mconcat . traverse onEach
  where
    onEach x = partitionOne x <$> p x
    partitionOne x True  = ([x], [])
    partitionOne x False = ([], [x])
partitionA :: Applicative f => (a -> f Bool) -> [a] -> f ([a], [a])
partitionA p =
  fmap mconcat . traverse onEach
  where
    onEach x = partitionOne x <$> p x
    partitionOne x True  = ([x], [])
    partitionOne x False = ([], [x])
partitionA p =
  fmap mconcat . traverse onEach
  where
    onEach x = partitionOne x <$> p x
    partitionOne x True  = ([x], [])
    partitionOne x False = ([], [x])