POptional

interface POptional<S, T, A, B> : PSetter<S, T, A, B> , POptionalGetter<S, T, A> , PTraversal<S, T, A, B> , PEvery<S, T, A, B>

Optional is an optic that allows to focus into a structure and querying or copy'ing an optional focus.

import arrow.core.None
import arrow.core.Option
import arrow.core.Some
import arrow.optics.Optional

data class User(val username: String, val email: Option<String>) {
companion object {
// can be out generated by @optics
val email: Optional<User, String> = Optional(User::email) { user, email ->
user.copy(email = Some(email))
}
}
}

fun main(args: Array<String>) {
val original = User("arrow-user", None)
val set = User.email.set(original, "arRoW-UsEr@arrow-Kt.IO")
val modified = User.email.modify(set, String::toLowerCase)
println("original: $original, set: $set, modified: $modified")
}

A (polymorphic) POptional is useful when setting or modifying a value for a type with a optional polymorphic focus i.e. POptional, Either, Int, String>

A POptional can be seen as a weaker Lens and Prism and combines their weakest functions:

  • set: (S, B) -> T meaning we can focus into an S and set a value B for a target A and obtain a modified source T

  • getOrModify: (S) -> Either<T, A> meaning it returns the focus of a POptional OR the original value

Parameters

S

the source of a POptional

T

the modified source of a POptional

A

the focus of a POptional

B

the modified focus of a POptional

Types

Link copied to clipboard
object Companion

Functions

Link copied to clipboard
open fun all(source: S, predicate: (A) -> Boolean): Boolean

Check if all targets satisfy the predicate

Link copied to clipboard
open fun any(source: S, predicate: (A) -> Boolean): Boolean

Returns true if at least one focus matches the given predicate.

Link copied to clipboard
open infix fun <C> choice(other: Fold<C, A>): Fold<Either<S, C>, A>

Join two Fold with the same target

open infix fun <S1, T1> choice(other: POptional<S1, T1, A, B>): POptional<Either<S, S1>, Either<T, T1>, A, B>

Join two POptional with the same focus B

open infix fun <S1, T1> choice(other: POptionalGetter<S1, T1, A>): POptionalGetter<Either<S, S1>, Either<T, T1>, A>

Join two POptionalGetter with the same focus

open infix fun <U, V> choice(other: PSetter<U, V, A, B>): PSetter<Either<S, U>, Either<T, V>, A, B>

Join two PSetter with the same target

open fun <U, V> choice(other: PTraversal<U, V, A, B>): PTraversal<Either<S, U>, Either<T, V>, A, B>
Link copied to clipboard
open fun combineAll(M: Monoid<A>, source: S): A

Alias for fold.

Link copied to clipboard
open infix fun <C> compose(other: Fold<in A, out C>): Fold<S, C>

Compose a Fold with a Fold

open infix fun <C, D> compose(other: PEvery<in A, out B, out C, in D>): PEvery<S, T, C, D>

Compose a PEvery with a PEvery

open infix fun <C, D> compose(other: POptional<in A, out B, out C, in D>): POptional<S, T, C, D>

Compose a POptional with a POptional

open infix fun <C> compose(other: POptionalGetter<in A, T, out C>): POptionalGetter<S, T, C>
open infix fun <C, D> compose(other: PSetter<in A, out B, out C, in D>): PSetter<S, T, C, D>

Compose a PSetter with a PSetter

open infix fun <C, D> compose(other: PTraversal<in A, out B, out C, in D>): PTraversal<S, T, C, D>

Compose a PTraversal with a PTraversal

Link copied to clipboard
open fun exists(source: S, predicate: (A) -> Boolean): Boolean

Check whether at least one element satisfies the predicate.

Link copied to clipboard
open fun findOrNull(source: S, predicate: (A) -> Boolean): A?

Find the first element matching the predicate, if one exists.

Link copied to clipboard
open override fun <C> first(): POptional<Pair<S, C>, Pair<T, C>, Pair<A, C>, Pair<B, C>>

Create a product of the POptional and a type C

Link copied to clipboard
open fun firstOrNull(source: S): A?

Get the first target or null

Link copied to clipboard
open fun fold(M: Monoid<A>, source: S): A

Fold using the given Monoid instance.

Link copied to clipboard
open override fun <R> foldMap(    M: Monoid<R>,     source: S,     map: (A) -> R): R

Map each target to a type R and use a Monoid to fold the results

Link copied to clipboard
open fun getAll(source: S): List<A>

Get all targets of the Fold

Link copied to clipboard
abstract override fun getOrModify(source: S): Either<T, A>

Get the focus of a POptional or return the original value while allowing the type to change if it does not match

Link copied to clipboard
open fun getOrNull(source: S): A?

Get the focus of an OptionalGetter or null if the is not there

Link copied to clipboard
open fun isEmpty(source: S): Boolean

Check if there is no target

Link copied to clipboard
open fun isNotEmpty(source: S): Boolean

Check if there is at least one target

Link copied to clipboard
open fun lastOrNull(source: S): A?

Get the last target or null

Link copied to clipboard
open fun <C> left(): Fold<Either<S, C>, Either<A, C>>

Create a sum of the Fold and a type C

Link copied to clipboard
open fun lift(map: (A) -> B): (S) -> T

Lift a function map: (A) -> B to the context of S: (S) -> T`

Link copied to clipboard
open override fun modify(source: S, map: (A) -> B): T

Modify the focus of a POptional with a function map

Link copied to clipboard
open fun modifyNullable(source: S, map: (A) -> B): T?

Modify the focus of a POptional with a function map

Link copied to clipboard
open operator fun <C> plus(other: Fold<in A, out C>): Fold<S, C>
open operator fun <C, D> plus(other: PEvery<in A, out B, out C, in D>): PEvery<S, T, C, D>
open operator fun <C, D> plus(other: POptional<in A, out B, out C, in D>): POptional<S, T, C, D>
open operator fun <C, D> plus(other: POptionalGetter<in A, T, out C>): POptionalGetter<S, T, C>
open operator fun <C, D> plus(other: PSetter<in A, out B, out C, in D>): PSetter<S, T, C, D>
open operator fun <C, D> plus(other: PTraversal<in A, out B, out C, in D>): PTraversal<S, T, C, D>
Link copied to clipboard
open fun <C> right(): Fold<Either<C, S>, Either<C, A>>

Create a sum of a type C and the Fold

Link copied to clipboard
open override fun <C> second(): POptional<Pair<C, S>, Pair<C, T>, Pair<C, A>, Pair<C, B>>

Create a product of a type C and the POptional

Link copied to clipboard
abstract override fun set(source: S, focus: B): T

Get the modified source of a POptional

Link copied to clipboard
open fun setNullable(source: S, b: B): T?

Set the focus of a POptional with a value.

Link copied to clipboard
open fun size(source: S): Int

Calculate the number of targets

Properties

Link copied to clipboard
open val <U, V> PLens<U, V, S, T>.every: PTraversal<U, V, A, B>

DSL to compose Traversal with a Lens for a structure S to see all its foci A

open val <U, V> PIso<U, V, S, T>.every: PTraversal<U, V, A, B>

DSL to compose Traversal with a Iso for a structure S to see all its foci A

open val <U, V> PPrism<U, V, S, T>.every: PTraversal<U, V, A, B>

DSL to compose Traversal with a Prism for a structure S to see all its foci A

open val <U, V> POptional<U, V, S, T>.every: PTraversal<U, V, A, B>

DSL to compose Traversal with a Optional for a structure S to see all its foci A

open val <U, V> PSetter<U, V, S, T>.every: PSetter<U, V, A, B>

DSL to compose Traversal with a Setter for a structure S to see all its foci A

open val <U, V> PTraversal<U, V, S, T>.every: PTraversal<U, V, A, B>

DSL to compose Traversal with a Traversal for a structure S to see all its foci A

open val <U, V> PEvery<U, V, S, T>.every: PTraversal<U, V, A, B>

DSL to compose Traversal with a PEvery for a structure S to see all its foci A

Inheritors

Link copied to clipboard
Link copied to clipboard
Link copied to clipboard