Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Optics] Optional getter #2611

Merged
merged 4 commits into from
Feb 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 65 additions & 4 deletions arrow-libs/optics/arrow-optics/api/arrow-optics.api
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ public final class arrow/optics/ListKt {
public static final fun unsnoc (Ljava/util/List;)Lkotlin/Pair;
}

public final class arrow/optics/OptionalGetterKt {
public static final fun OptionalGetter (Lkotlin/jvm/functions/Function1;)Larrow/optics/POptionalGetter;
}

public final class arrow/optics/OptionalKt {
public static final fun Optional (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Larrow/optics/POptional;
}
Expand Down Expand Up @@ -285,6 +289,7 @@ public final class arrow/optics/PIso$DefaultImpls {
public static fun choice (Larrow/optics/PIso;Larrow/optics/Getter;)Larrow/optics/Getter;
public static fun choice (Larrow/optics/PIso;Larrow/optics/PLens;)Larrow/optics/PLens;
public static fun choice (Larrow/optics/PIso;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun choice (Larrow/optics/PIso;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun choice (Larrow/optics/PIso;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun choice (Larrow/optics/PIso;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun combineAll (Larrow/optics/PIso;Larrow/typeclasses/Monoid;Ljava/lang/Object;)Ljava/lang/Object;
Expand All @@ -294,6 +299,7 @@ public final class arrow/optics/PIso$DefaultImpls {
public static fun compose (Larrow/optics/PIso;Larrow/optics/PIso;)Larrow/optics/PIso;
public static fun compose (Larrow/optics/PIso;Larrow/optics/PLens;)Larrow/optics/PLens;
public static fun compose (Larrow/optics/PIso;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun compose (Larrow/optics/PIso;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun compose (Larrow/optics/PIso;Larrow/optics/PPrism;)Larrow/optics/PPrism;
public static fun compose (Larrow/optics/PIso;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun compose (Larrow/optics/PIso;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
Expand Down Expand Up @@ -327,6 +333,7 @@ public final class arrow/optics/PIso$DefaultImpls {
public static fun plus (Larrow/optics/PIso;Larrow/optics/PIso;)Larrow/optics/PIso;
public static fun plus (Larrow/optics/PIso;Larrow/optics/PLens;)Larrow/optics/PLens;
public static fun plus (Larrow/optics/PIso;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun plus (Larrow/optics/PIso;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun plus (Larrow/optics/PIso;Larrow/optics/PPrism;)Larrow/optics/PPrism;
public static fun plus (Larrow/optics/PIso;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun plus (Larrow/optics/PIso;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
Expand All @@ -343,7 +350,7 @@ public final class arrow/optics/PIso$DefaultImpls {
public static fun zip (Larrow/optics/PIso;Larrow/optics/Getter;)Larrow/optics/Getter;
}

public abstract interface class arrow/optics/PLens : arrow/optics/Fold, arrow/optics/Getter, arrow/optics/PEvery, arrow/optics/POptional, arrow/optics/PSetter, arrow/optics/PTraversal {
public abstract interface class arrow/optics/PLens : arrow/optics/Getter, arrow/optics/PEvery, arrow/optics/POptional, arrow/optics/PSetter, arrow/optics/PTraversal {
public static final field Companion Larrow/optics/PLens$Companion;
public abstract fun choice (Larrow/optics/PLens;)Larrow/optics/PLens;
public abstract fun compose (Larrow/optics/PLens;)Larrow/optics/PLens;
Expand Down Expand Up @@ -394,6 +401,7 @@ public final class arrow/optics/PLens$DefaultImpls {
public static fun choice (Larrow/optics/PLens;Larrow/optics/Getter;)Larrow/optics/Getter;
public static fun choice (Larrow/optics/PLens;Larrow/optics/PLens;)Larrow/optics/PLens;
public static fun choice (Larrow/optics/PLens;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun choice (Larrow/optics/PLens;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun choice (Larrow/optics/PLens;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun choice (Larrow/optics/PLens;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun combineAll (Larrow/optics/PLens;Larrow/typeclasses/Monoid;Ljava/lang/Object;)Ljava/lang/Object;
Expand All @@ -402,6 +410,7 @@ public final class arrow/optics/PLens$DefaultImpls {
public static fun compose (Larrow/optics/PLens;Larrow/optics/PEvery;)Larrow/optics/PEvery;
public static fun compose (Larrow/optics/PLens;Larrow/optics/PLens;)Larrow/optics/PLens;
public static fun compose (Larrow/optics/PLens;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun compose (Larrow/optics/PLens;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun compose (Larrow/optics/PLens;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun compose (Larrow/optics/PLens;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun exists (Larrow/optics/PLens;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
Expand Down Expand Up @@ -432,6 +441,7 @@ public final class arrow/optics/PLens$DefaultImpls {
public static fun plus (Larrow/optics/PLens;Larrow/optics/PEvery;)Larrow/optics/PEvery;
public static fun plus (Larrow/optics/PLens;Larrow/optics/PLens;)Larrow/optics/PLens;
public static fun plus (Larrow/optics/PLens;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun plus (Larrow/optics/PLens;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun plus (Larrow/optics/PLens;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun plus (Larrow/optics/PLens;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun right (Larrow/optics/PLens;)Larrow/optics/Getter;
Expand All @@ -443,14 +453,13 @@ public final class arrow/optics/PLens$DefaultImpls {
public static fun zip (Larrow/optics/PLens;Larrow/optics/Getter;)Larrow/optics/Getter;
}

public abstract interface class arrow/optics/POptional : arrow/optics/Fold, arrow/optics/PEvery, arrow/optics/PSetter, arrow/optics/PTraversal {
public abstract interface class arrow/optics/POptional : arrow/optics/PEvery, arrow/optics/POptionalGetter, arrow/optics/PSetter, arrow/optics/PTraversal {
public static final field Companion Larrow/optics/POptional$Companion;
public abstract fun choice (Larrow/optics/POptional;)Larrow/optics/POptional;
public abstract fun compose (Larrow/optics/POptional;)Larrow/optics/POptional;
public abstract fun first ()Larrow/optics/POptional;
public abstract fun foldMap (Larrow/typeclasses/Monoid;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public abstract fun getOrModify (Ljava/lang/Object;)Larrow/core/Either;
public abstract fun getOrNull (Ljava/lang/Object;)Ljava/lang/Object;
public static fun listHead ()Larrow/optics/POptional;
public static fun listTail ()Larrow/optics/POptional;
public abstract fun modify (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
Expand All @@ -475,12 +484,14 @@ public final class arrow/optics/POptional$DefaultImpls {
public static fun any (Larrow/optics/POptional;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
public static fun choice (Larrow/optics/POptional;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun choice (Larrow/optics/POptional;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun choice (Larrow/optics/POptional;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun choice (Larrow/optics/POptional;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun choice (Larrow/optics/POptional;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun combineAll (Larrow/optics/POptional;Larrow/typeclasses/Monoid;Ljava/lang/Object;)Ljava/lang/Object;
public static fun compose (Larrow/optics/POptional;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun compose (Larrow/optics/POptional;Larrow/optics/PEvery;)Larrow/optics/PEvery;
public static fun compose (Larrow/optics/POptional;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun compose (Larrow/optics/POptional;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun compose (Larrow/optics/POptional;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun compose (Larrow/optics/POptional;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun exists (Larrow/optics/POptional;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
Expand Down Expand Up @@ -508,6 +519,7 @@ public final class arrow/optics/POptional$DefaultImpls {
public static fun plus (Larrow/optics/POptional;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun plus (Larrow/optics/POptional;Larrow/optics/PEvery;)Larrow/optics/PEvery;
public static fun plus (Larrow/optics/POptional;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun plus (Larrow/optics/POptional;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun plus (Larrow/optics/POptional;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun plus (Larrow/optics/POptional;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun right (Larrow/optics/POptional;)Larrow/optics/Fold;
Expand All @@ -516,7 +528,53 @@ public final class arrow/optics/POptional$DefaultImpls {
public static fun size (Larrow/optics/POptional;Ljava/lang/Object;)I
}

public abstract interface class arrow/optics/PPrism : arrow/optics/Fold, arrow/optics/PEvery, arrow/optics/POptional, arrow/optics/PSetter, arrow/optics/PTraversal {
public abstract interface class arrow/optics/POptionalGetter : arrow/optics/Fold {
public static final field Companion Larrow/optics/POptionalGetter$Companion;
public abstract fun choice (Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public abstract fun compose (Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun filter (Lkotlin/jvm/functions/Function1;)Larrow/optics/POptionalGetter;
public abstract fun first ()Larrow/optics/POptionalGetter;
public abstract fun foldMap (Larrow/typeclasses/Monoid;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public abstract fun getOrModify (Ljava/lang/Object;)Larrow/core/Either;
public abstract fun getOrNull (Ljava/lang/Object;)Ljava/lang/Object;
public abstract fun plus (Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public abstract fun second ()Larrow/optics/POptionalGetter;
}

public final class arrow/optics/POptionalGetter$Companion {
public final fun filter (Lkotlin/jvm/functions/Function1;)Larrow/optics/POptionalGetter;
public final fun id ()Larrow/optics/PIso;
public final fun invoke (Lkotlin/jvm/functions/Function1;)Larrow/optics/POptionalGetter;
}

public final class arrow/optics/POptionalGetter$DefaultImpls {
public static fun all (Larrow/optics/POptionalGetter;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
public static fun any (Larrow/optics/POptionalGetter;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
public static fun choice (Larrow/optics/POptionalGetter;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun choice (Larrow/optics/POptionalGetter;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun combineAll (Larrow/optics/POptionalGetter;Larrow/typeclasses/Monoid;Ljava/lang/Object;)Ljava/lang/Object;
public static fun compose (Larrow/optics/POptionalGetter;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun compose (Larrow/optics/POptionalGetter;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun exists (Larrow/optics/POptionalGetter;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
public static fun findOrNull (Larrow/optics/POptionalGetter;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static fun first (Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun firstOrNull (Larrow/optics/POptionalGetter;Ljava/lang/Object;)Ljava/lang/Object;
public static fun fold (Larrow/optics/POptionalGetter;Larrow/typeclasses/Monoid;Ljava/lang/Object;)Ljava/lang/Object;
public static fun foldMap (Larrow/optics/POptionalGetter;Larrow/typeclasses/Monoid;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static fun getAll (Larrow/optics/POptionalGetter;Ljava/lang/Object;)Ljava/util/List;
public static fun getOrNull (Larrow/optics/POptionalGetter;Ljava/lang/Object;)Ljava/lang/Object;
public static fun isEmpty (Larrow/optics/POptionalGetter;Ljava/lang/Object;)Z
public static fun isNotEmpty (Larrow/optics/POptionalGetter;Ljava/lang/Object;)Z
public static fun lastOrNull (Larrow/optics/POptionalGetter;Ljava/lang/Object;)Ljava/lang/Object;
public static fun left (Larrow/optics/POptionalGetter;)Larrow/optics/Fold;
public static fun plus (Larrow/optics/POptionalGetter;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun plus (Larrow/optics/POptionalGetter;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun right (Larrow/optics/POptionalGetter;)Larrow/optics/Fold;
public static fun second (Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun size (Larrow/optics/POptionalGetter;Ljava/lang/Object;)I
}

public abstract interface class arrow/optics/PPrism : arrow/optics/PEvery, arrow/optics/POptional, arrow/optics/POptionalGetter, arrow/optics/PSetter, arrow/optics/PTraversal {
public static final field Companion Larrow/optics/PPrism$Companion;
public abstract fun compose (Larrow/optics/PPrism;)Larrow/optics/PPrism;
public abstract fun first ()Larrow/optics/PPrism;
Expand Down Expand Up @@ -550,12 +608,14 @@ public final class arrow/optics/PPrism$DefaultImpls {
public static fun any (Larrow/optics/PPrism;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z
public static fun choice (Larrow/optics/PPrism;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun choice (Larrow/optics/PPrism;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun choice (Larrow/optics/PPrism;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun choice (Larrow/optics/PPrism;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun choice (Larrow/optics/PPrism;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
public static fun combineAll (Larrow/optics/PPrism;Larrow/typeclasses/Monoid;Ljava/lang/Object;)Ljava/lang/Object;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/PEvery;)Larrow/optics/PEvery;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/PPrism;)Larrow/optics/PPrism;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun compose (Larrow/optics/PPrism;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
Expand Down Expand Up @@ -585,6 +645,7 @@ public final class arrow/optics/PPrism$DefaultImpls {
public static fun plus (Larrow/optics/PPrism;Larrow/optics/Fold;)Larrow/optics/Fold;
public static fun plus (Larrow/optics/PPrism;Larrow/optics/PEvery;)Larrow/optics/PEvery;
public static fun plus (Larrow/optics/PPrism;Larrow/optics/POptional;)Larrow/optics/POptional;
public static fun plus (Larrow/optics/PPrism;Larrow/optics/POptionalGetter;)Larrow/optics/POptionalGetter;
public static fun plus (Larrow/optics/PPrism;Larrow/optics/PPrism;)Larrow/optics/PPrism;
public static fun plus (Larrow/optics/PPrism;Larrow/optics/PSetter;)Larrow/optics/PSetter;
public static fun plus (Larrow/optics/PPrism;Larrow/optics/PTraversal;)Larrow/optics/PTraversal;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package arrow.optics
import arrow.core.Either
import arrow.core.compose
import arrow.core.identity
import arrow.core.right
import arrow.typeclasses.Monoid

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public typealias Lens<S, A> = PLens<S, S, A, A>
* @param A the focus of a [PLens]
* @param B the modified focus of a [PLens]
*/
public interface PLens<S, T, A, B> : Getter<S, A>, POptional<S, T, A, B>, PSetter<S, T, A, B>, Fold<S, A>,
public interface PLens<S, T, A, B> : Getter<S, A>, POptional<S, T, A, B>, PSetter<S, T, A, B>,
PTraversal<S, T, A, B>, PEvery<S, T, A, B> {

override fun get(source: S): A
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public fun <S, A> Optional(getOption: (source: S) -> Option<A>, set: (source: S,
* @param A the focus of a [POptional]
* @param B the modified focus of a [POptional]
*/
public interface POptional<S, T, A, B> : PSetter<S, T, A, B>, Fold<S, A>, PTraversal<S, T, A, B>, PEvery<S, T, A, B> {
public 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> {

/**
* Get the modified source of a [POptional]
Expand All @@ -69,22 +69,16 @@ public interface POptional<S, T, A, B> : PSetter<S, T, A, B>, Fold<S, A>, PTrave
/**
* Get the focus of a [POptional] or return the original value while allowing the type to change if it does not match
*/
public fun getOrModify(source: S): Either<T, A>

/**
* Modify the focus of a [POptional] with a function [map]
*/
override fun modify(source: S, map: (focus: A) -> B): T =
getOrModify(source).fold(::identity) { a -> set(source, map(a)) }
override fun getOrModify(source: S): Either<T, A>

override fun <R> foldMap(M: Monoid<R>, source: S, map: (focus: A) -> R): R =
getOrModify(source).map(map).fold({ M.empty() }, ::identity)

/**
* Get the focus of a [POptional] or `null` if the is not there
* Modify the focus of a [POptional] with a function [map]
*/
public fun getOrNull(source: S): A? =
getOrModify(source).orNull()
override fun modify(source: S, map: (focus: A) -> B): T =
getOrModify(source).fold(::identity) { a -> set(source, map(a)) }

/**
* Set the focus of a [POptional] with a value.
Expand Down Expand Up @@ -123,7 +117,7 @@ public interface POptional<S, T, A, B> : PSetter<S, T, A, B>, Fold<S, A>, PTrave
/**
* Create a product of the [POptional] and a type [C]
*/
public fun <C> first(): POptional<Pair<S, C>, Pair<T, C>, Pair<A, C>, Pair<B, C>> =
public override fun <C> first(): POptional<Pair<S, C>, Pair<T, C>, Pair<A, C>, Pair<B, C>> =
POptional(
{ (source, c) -> getOrModify(source).bimap({ Pair(it, c) }, { Pair(it, c) }) },
{ (source, c2), (update, c) -> setNullable(source, update)?.let { Pair(it, c) } ?: Pair(set(source, update), c2) }
Expand All @@ -132,7 +126,7 @@ public interface POptional<S, T, A, B> : PSetter<S, T, A, B>, Fold<S, A>, PTrave
/**
* Create a product of a type [C] and the [POptional]
*/
public fun <C> second(): POptional<Pair<C, S>, Pair<C, T>, Pair<C, A>, Pair<C, B>> =
public override fun <C> second(): POptional<Pair<C, S>, Pair<C, T>, Pair<C, A>, Pair<C, B>> =
POptional(
{ (c, s) -> getOrModify(s).bimap({ c to it }, { c to it }) },
{ (c2, s), (c, b) -> setNullable(s, b)?.let { c to it } ?: c2 to set(s, b) }
Expand Down
Loading