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;
     }