You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/04/06 12:47:40 UTC
[isis] branch master updated: ISIS-2297: cleaning up Railway
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 30b6c167f5 ISIS-2297: cleaning up Railway<T>
30b6c167f5 is described below
commit 30b6c167f56f15f4ec735236fea9a468adc72417
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Apr 6 14:47:32 2022 +0200
ISIS-2297: cleaning up Railway<T>
---
.../org/apache/isis/commons/functional/Either.java | 14 -------
.../apache/isis/commons/functional/Railway.java | 45 ++++++----------------
.../interactions/managed/ActionInteraction.java | 12 +++---
.../interactions/managed/MemberInteraction.java | 24 ++++++------
.../interactions/managed/PropertyInteraction.java | 11 +++---
5 files changed, 34 insertions(+), 72 deletions(-)
diff --git a/commons/src/main/java/org/apache/isis/commons/functional/Either.java b/commons/src/main/java/org/apache/isis/commons/functional/Either.java
index 8072a6547e..964586764a 100644
--- a/commons/src/main/java/org/apache/isis/commons/functional/Either.java
+++ b/commons/src/main/java/org/apache/isis/commons/functional/Either.java
@@ -108,20 +108,6 @@ public class Either<L, R> implements Serializable {
: right(rightMapper.apply(right));
}
- //TODO how is this called in the functional world?
- public final Either<L, R> mapIfLeft(final @NonNull Function<L, Either<L, R>> leftRemapper){
- return isLeft()
- ? leftRemapper.apply(left)
- : this;
- }
-
- //TODO how is this called in the functional world?
- public final Either<L, R> mapIfRight(final @NonNull Function<R, Either<L, R>> rightRemapper){
- return isLeft()
- ? this
- : rightRemapper.apply(right);
- }
-
// -- FOLDING
public final <T> T fold(final @NonNull BiFunction<L, R, T> biMapper){
diff --git a/commons/src/main/java/org/apache/isis/commons/functional/Railway.java b/commons/src/main/java/org/apache/isis/commons/functional/Railway.java
index 1f9242c3a3..72bf9078e0 100644
--- a/commons/src/main/java/org/apache/isis/commons/functional/Railway.java
+++ b/commons/src/main/java/org/apache/isis/commons/functional/Railway.java
@@ -96,12 +96,12 @@ public interface Railway<F, S> {
/**
* Maps this {@link Railway} to another if its a {@link Success}.
- * Otherwise if its a {@link Failure} acts as identity operator.
+ * Otherwise if this is a {@link Failure} acts as identity operator.
*/
<R> Railway<F, R> mapSuccess(final @NonNull Function<S, R> successMapper);
/**
* Maps this {@link Railway} to another if its a {@link Failure}.
- * Otherwise if its a {@link Success} acts as identity operator.
+ * Otherwise if this is a {@link Success} acts as identity operator.
*/
<R> Railway<R, S> mapFailure(final @NonNull Function<F, R> failureMapper);
@@ -115,21 +115,18 @@ public interface Railway<F, S> {
final @NonNull Function<F, R> failureMapper,
final @NonNull Function<S, R> successMapper);
- // -- CONCATENATION
+ // -- CHAINING
/**
* <h1>Railway Pattern</h1>
- * If this is a {@link Success}, the result is {@code other}.
- * Otherwise if this is a {@link Failure} returns this.
+ * If this is a {@link Success}, returns a new {@link Railway} as produced by the
+ * chainingFunction, that receives the current success value as input.
+ * Otherwise if this is a {@link Failure} acts as identity operator and
+ * the chainingFunction is not executed.
* <p>
* In other words: if once failed stays failed
*/
- Railway<F, S> concatenate(final @NonNull Railway<F, S> other);
-
- //TODO how is this called in the functional world?
- Railway<F, S> mapIfFailure(@NonNull Function<F, Railway<F, S>> remapper);
- //TODO how is this called in the functional world?
- Railway<F, S> mapIfSuccess(@NonNull Function<S, Railway<F, S>> remapper);
+ Railway<F, S> chain(@NonNull Function<S, Railway<F, S>> chainingFunction);
// -- SUCCESS
@@ -175,18 +172,8 @@ public interface Railway<F, S> {
}
@Override
- public Railway<F, S> concatenate(final @NonNull Railway<F, S> other) {
- return other;
- }
-
- @Override
- public Railway<F, S> mapIfSuccess(final @NonNull Function<S, Railway<F, S>> remapper){
- return remapper.apply(success);
- }
-
- @Override
- public Railway<F, S> mapIfFailure(final @NonNull Function<F, Railway<F, S>> remapper){
- return this;
+ public Railway<F, S> chain(final @NonNull Function<S, Railway<F, S>> chainingFunction){
+ return chainingFunction.apply(success);
}
}
@@ -235,20 +222,10 @@ public interface Railway<F, S> {
}
@Override
- public Failure<F, S> concatenate(final @NonNull Railway<F, S> callable) {
+ public Railway<F, S> chain(final @NonNull Function<S, Railway<F, S>> chainingFunction){
return this;
}
- @Override
- public Railway<F, S> mapIfSuccess(final @NonNull Function<S, Railway<F, S>> remapper){
- return this;
- }
-
- @Override
- public Railway<F, S> mapIfFailure(final @NonNull Function<F, Railway<F, S>> remapper){
- return remapper.apply(failure);
- }
-
}
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
index 394eb93c81..32ae1081b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
@@ -106,22 +106,22 @@ extends MemberInteraction<ManagedAction, ActionInteraction> {
public ActionInteraction checkSemanticConstraint(@NonNull final SemanticConstraint semanticConstraint) {
- railway = railway.mapIfSuccess(action->{
+ railway = railway.chain(action->{
val actionSemantics = action.getAction().getSemantics();
switch(semanticConstraint) {
case NONE:
- return Railway.success(action);
+ return railway;
case IDEMPOTENT:
return actionSemantics.isIdempotentInNature()
- ? Railway.success(action)
- : Railway.failure(InteractionVeto.actionNotIdempotent(action)) ;
+ ? railway
+ : vetoRailway(InteractionVeto.actionNotIdempotent(action)) ;
case SAFE:
return actionSemantics.isSafeInNature()
- ? Railway.success(action)
- : Railway.failure(InteractionVeto.actionNotSafe(action));
+ ? railway
+ : vetoRailway(InteractionVeto.actionNotSafe(action));
default:
throw _Exceptions.unmatchedCase(semanticConstraint); // unexpected code reach
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java
index 84984c1ab0..512d9675f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/MemberInteraction.java
@@ -44,22 +44,18 @@ public abstract class MemberInteraction<T extends ManagedMember, H extends Membe
}
public H checkVisibility() {
- railway = railway.mapIfSuccess(property->{
- val visibilityVeto = property.checkVisibility();
- return visibilityVeto.isPresent()
- ? Railway.failure(visibilityVeto.get())
- : Railway.success(property);
- });
+ railway = railway.chain(property->
+ property.checkVisibility()
+ .map(this::vetoRailway)
+ .orElse(railway));
return _Casts.uncheckedCast(this);
}
public H checkUsability() {
- railway = railway.mapIfSuccess(property->{
- val usablitiyVeto = property.checkUsability();
- return usablitiyVeto.isPresent()
- ? Railway.failure(usablitiyVeto.get())
- : Railway.success(property);
- });
+ railway = railway.chain(property->
+ property.checkUsability()
+ .map(this::vetoRailway)
+ .orElse(railway));
return _Casts.uncheckedCast(this);
}
@@ -110,5 +106,9 @@ public abstract class MemberInteraction<T extends ManagedMember, H extends Membe
return railway.getSuccessElseFail(onFailure);
}
+ protected Railway<InteractionVeto, T> vetoRailway(final InteractionVeto veto) {
+ return Railway.failure(veto);
+ }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java
index 5320ffc984..177e5970ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyInteraction.java
@@ -62,12 +62,11 @@ extends MemberInteraction<ManagedProperty, PropertyInteraction> {
public PropertyInteraction modifyProperty(
final @NonNull Function<ManagedProperty, ManagedObject> newProperyValueProvider) {
- railway = railway.mapIfSuccess(property->{
- val validityVeto = property.modifyProperty(newProperyValueProvider.apply(property));
- return validityVeto.isPresent()
- ? Railway.failure(validityVeto.get())
- : Railway.success(property);
- });
+ railway = railway.chain(property->
+ property.modifyProperty(newProperyValueProvider.apply(property))
+ .map(super::vetoRailway)
+ .orElse(railway));
+
return this;
}