From e1c7bb3bc5d839ebc611e6117c1da4d50980f91f Mon Sep 17 00:00:00 2001 From: Guillaume Lung Date: Tue, 11 Apr 2017 23:49:27 +0200 Subject: [PATCH] Api proposal : the store state's type is inferred by the creation method (#21) Bump jvm-api to 2.0.0 and implements redux-java new API --- examples/basic/build.gradle | 2 +- .../java/com/glung/redux/BasicApplication.java | 2 +- .../java/com/glung/redux/ReduxApplication.java | 2 +- lib/build.gradle | 5 ++--- .../main/java/com/glung/redux/Middlewares.java | 18 +++++++++++------- lib/src/main/java/com/glung/redux/Store.java | 13 +++++++++---- .../java/com/glung/redux/MiddlewaresTest.java | 4 ++-- .../test/java/com/glung/redux/StoreTest.java | 6 ++++-- 8 files changed, 31 insertions(+), 21 deletions(-) diff --git a/examples/basic/build.gradle b/examples/basic/build.gradle index 4922902..d2334fa 100644 --- a/examples/basic/build.gradle +++ b/examples/basic/build.gradle @@ -11,6 +11,6 @@ repositories { dependencies { compile project(':lib') - compile 'com.github.jvm-redux.jvm-redux-api:api:1.2.0' + compile 'com.github.jvm-redux.jvm-redux-api:api:2.0.0' testCompile 'junit:junit:4.12' } diff --git a/examples/basic/src/main/java/com/glung/redux/BasicApplication.java b/examples/basic/src/main/java/com/glung/redux/BasicApplication.java index ab37656..ab3bc81 100644 --- a/examples/basic/src/main/java/com/glung/redux/BasicApplication.java +++ b/examples/basic/src/main/java/com/glung/redux/BasicApplication.java @@ -3,7 +3,7 @@ class BasicApplication { public static void main(String[] args) { - final Store.Creator creator = new Store.Creator<>(); + final Store.Creator creator = new Store.Creator(); final ReduxApplication application = new ReduxApplication(creator, System.out); application.runDemo(); } diff --git a/examples/basic/src/main/java/com/glung/redux/ReduxApplication.java b/examples/basic/src/main/java/com/glung/redux/ReduxApplication.java index dce12bc..2a959d8 100644 --- a/examples/basic/src/main/java/com/glung/redux/ReduxApplication.java +++ b/examples/basic/src/main/java/com/glung/redux/ReduxApplication.java @@ -8,7 +8,7 @@ class ReduxApplication { private final redux.api.Store store; private final PrintStream stream; - ReduxApplication(redux.api.Store.Creator storeCreator, PrintStream stream) { + ReduxApplication(redux.api.Store.Creator storeCreator, PrintStream stream) { store = storeCreator.create(new MyReducer(), 0); this.stream = stream; } diff --git a/lib/build.gradle b/lib/build.gradle index fd0aa88..95310f9 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -9,7 +9,6 @@ repositories { } dependencies { - compile 'com.github.jvm-redux.jvm-redux-api:api:1.2.0' - - testCompile 'com.github.jvm-redux.jvm-redux-api:specs:1.2.0' + compile 'com.github.jvm-redux.jvm-redux-api:api:2.0.0' + testCompile 'com.github.jvm-redux.jvm-redux-api:specs:2.0.0' } diff --git a/lib/src/main/java/com/glung/redux/Middlewares.java b/lib/src/main/java/com/glung/redux/Middlewares.java index 11bd0eb..0a0a09f 100644 --- a/lib/src/main/java/com/glung/redux/Middlewares.java +++ b/lib/src/main/java/com/glung/redux/Middlewares.java @@ -43,15 +43,19 @@ public Object dispatch(Object action) { } - public static Store.Enhancer applyMiddlewares(final Middleware... middlewares) { - return new Store.Enhancer() { + public static Store.Enhancer applyMiddlewares(final Middleware... middlewares) { + return new Store.Enhancer() { @Override - public Store.Creator enhance(final Store.Creator next) { - return new Store.Creator() { + public Store.Creator enhance(final Store.Creator next) { + return new Store.Creator() { @Override - public Store create(final Reducer reducer, final S initialState) { - Store store = next.create(reducer, initialState); - return new MiddlewareStore<>(store, createMiddlewareDispatcher(Arrays.asList(middlewares), store)); + public Store create(final Reducer reducer, final S initialState) { + final Store store = next.create(reducer, initialState); + // This is fqr from ideal but currently it is expected that the Middleware and the Reducer carry the same type. + // This is checked at run time (cf down cast below) + // + // Revisit when needed + return new MiddlewareStore<>(store, createMiddlewareDispatcher(Arrays.asList(middlewares), (Store) store)); } }; } diff --git a/lib/src/main/java/com/glung/redux/Store.java b/lib/src/main/java/com/glung/redux/Store.java index 2a0ddf3..5580b47 100644 --- a/lib/src/main/java/com/glung/redux/Store.java +++ b/lib/src/main/java/com/glung/redux/Store.java @@ -14,6 +14,11 @@ public class Store implements redux.api.Store { private Reducer reducer; private S currentState; + public static redux.api.Store createStore(Reducer reducer, S initialState, Enhancer enhancer) { + final redux.api.Store.Creator creator = enhancer != null ? enhancer.enhance(new Creator()) : new Creator(); + return creator.create(reducer, initialState); + } + Store(Reducer reducer, S initialState) { this.currentState = initialState; setReducer(reducer); @@ -42,7 +47,7 @@ public void replaceReducer(Reducer reducer) { private void setReducer(Reducer reducer) { this.reducer = reducer; - this.reducer.reduce(currentState, redux.api.Store.INIT); + this.currentState = this.reducer.reduce(currentState, redux.api.Store.INIT); } @Override @@ -82,11 +87,11 @@ private void startReducing() { isReducing.set(true); } - public static class Creator implements redux.api.Store.Creator { + public static class Creator implements redux.api.Store.Creator { @Override - public redux.api.Store create(Reducer reducer, S initialState) { - return new Store(reducer, initialState); + public redux.api.Store create(Reducer reducer, S initialState) { + return new Store<>(reducer, initialState); } } } diff --git a/lib/src/test/java/com/glung/redux/MiddlewaresTest.java b/lib/src/test/java/com/glung/redux/MiddlewaresTest.java index ebceee4..cca3f19 100644 --- a/lib/src/test/java/com/glung/redux/MiddlewaresTest.java +++ b/lib/src/test/java/com/glung/redux/MiddlewaresTest.java @@ -27,12 +27,12 @@ public class MiddlewaresTest { @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); - @Mock private redux.api.Store.Creator storeCreator; + @Mock private redux.api.Store.Creator storeCreator; @Mock private Store storeMock; private final List callOrderResult = new ArrayList<>(); - private Store.Creator enhancedStoreCreator() { + private Store.Creator enhancedStoreCreator() { when(storeCreator.create(any(Reducer.class), any(State.class))).thenReturn(storeMock); return applyMiddlewares(createMiddleware("ONE"), diff --git a/lib/src/test/java/com/glung/redux/StoreTest.java b/lib/src/test/java/com/glung/redux/StoreTest.java index 2ea142a..b1ece82 100644 --- a/lib/src/test/java/com/glung/redux/StoreTest.java +++ b/lib/src/test/java/com/glung/redux/StoreTest.java @@ -1,11 +1,13 @@ package com.glung.redux; +import org.jetbrains.annotations.NotNull; import redux.api.Reducer; public class StoreTest extends redux.api.StoreTest { + @NotNull @Override - public redux.api.Store createStore(Reducer reducer, S state) { - return new Store.Creator().create(reducer, state); + public redux.api.Store createStore(@NotNull Reducer reducer, @NotNull S state) { + return new Store.Creator().create(reducer, state); } }