# traverse

inline fun <E, A, B> Iterable<A>.traverse(f: (A) -> Either<E, B>): Either<E, List<B>>
inline fun <A, B> Iterable<A>.traverse(f: (A) -> Result<B>): Result<List<B>>
inline fun <E, A, B> Iterable<A>.traverse(semigroup: Semigroup<E>, f: (A) -> Validated<E, B>): Validated<E, List<B>>
inline fun <E, A, B> Iterable<A>.traverse(f: (A) -> ValidatedNel<E, B>): ValidatedNel<E, List<B>>
inline fun <A, B> Iterable<A>.traverse(f: (A) -> Option<B>): Option<List<B>>
inline fun <A, B> Iterable<A>.traverse(f: (A) -> B?): List<B>?
inline fun <E, A, B> NonEmptyList<A>.traverse(f: (A) -> Either<E, B>): Either<E, NonEmptyList<B>>
inline fun <E, A, B> NonEmptyList<A>.traverse(semigroup: Semigroup<E>, f: (A) -> Validated<E, B>): Validated<E, NonEmptyList<B>>
inline fun <A, B> NonEmptyList<A>.traverse(f: (A) -> Option<B>): Option<NonEmptyList<B>>
fun <E, A, B> Sequence<A>.traverse(f: (A) -> Either<E, B>): Either<E, List<B>>
fun <A, B> Sequence<A>.traverse(f: (A) -> Option<B>): Option<List<B>>
fun <E, A, B> Sequence<A>.traverse(semigroup: Semigroup<E>, f: (A) -> Validated<E, B>): Validated<E, List<B>>
inline fun <K, E, A, B> Map<K, A>.traverse(f: (A) -> Either<E, B>): Either<E, Map<K, B>>
inline fun <K, E, A, B> Map<K, A>.traverse(semigroup: Semigroup<E>, f: (A) -> Validated<E, B>): Validated<E, Map<K, B>>
inline fun <K, A, B> Map<K, A>.traverse(f: (A) -> Option<B>): Option<Map<K, B>>