Skip to content

Commit

Permalink
[Optics] Optional getter (#2611)
Browse files Browse the repository at this point in the history
Co-authored-by: Simon Vergauwen <nomisRev@users.noreply.github.com>
  • Loading branch information
serras and nomisRev authored Feb 9, 2022
1 parent ac2341b commit 5056131
Show file tree
Hide file tree
Showing 10 changed files with 263 additions and 21 deletions.
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

0 comments on commit 5056131

Please sign in to comment.