Skip to content

Commit

Permalink
Api proposal : the store state's type is inferred by the creation met…
Browse files Browse the repository at this point in the history
…hod (#21)

Bump jvm-api to 2.0.0 and implements redux-java new API
  • Loading branch information
glung committed Apr 11, 2017
1 parent e06cde8 commit e1c7bb3
Show file tree
Hide file tree
Showing 8 changed files with 31 additions and 21 deletions.
2 changes: 1 addition & 1 deletion examples/basic/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
class BasicApplication {

public static void main(String[] args) {
final Store.Creator<Integer> creator = new Store.Creator<>();
final Store.Creator creator = new Store.Creator();
final ReduxApplication application = new ReduxApplication(creator, System.out);
application.runDemo();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ReduxApplication {
private final redux.api.Store<Integer> store;
private final PrintStream stream;

ReduxApplication(redux.api.Store.Creator<Integer> storeCreator, PrintStream stream) {
ReduxApplication(redux.api.Store.Creator storeCreator, PrintStream stream) {
store = storeCreator.create(new MyReducer(), 0);
this.stream = stream;
}
Expand Down
5 changes: 2 additions & 3 deletions lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
18 changes: 11 additions & 7 deletions lib/src/main/java/com/glung/redux/Middlewares.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,19 @@ public Object dispatch(Object action) {

}

public static <S> Store.Enhancer<S> applyMiddlewares(final Middleware<S>... middlewares) {
return new Store.Enhancer<S>() {
public static <T> Store.Enhancer applyMiddlewares(final Middleware<T>... middlewares) {
return new Store.Enhancer() {
@Override
public Store.Creator<S> enhance(final Store.Creator<S> next) {
return new Store.Creator<S>() {
public Store.Creator enhance(final Store.Creator next) {
return new Store.Creator() {
@Override
public Store<S> create(final Reducer<S> reducer, final S initialState) {
Store<S> store = next.create(reducer, initialState);
return new MiddlewareStore<>(store, createMiddlewareDispatcher(Arrays.asList(middlewares), store));
public <S> Store<S> create(final Reducer<S> reducer, final S initialState) {
final Store<S> 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<T>) store));
}
};
}
Expand Down
13 changes: 9 additions & 4 deletions lib/src/main/java/com/glung/redux/Store.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ public class Store<S> implements redux.api.Store<S> {
private Reducer<S> reducer;
private S currentState;

public static <S> redux.api.Store<S> createStore(Reducer<S> 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<S> reducer, S initialState) {
this.currentState = initialState;
setReducer(reducer);
Expand Down Expand Up @@ -42,7 +47,7 @@ public void replaceReducer(Reducer<S> reducer) {

private void setReducer(Reducer<S> reducer) {
this.reducer = reducer;
this.reducer.reduce(currentState, redux.api.Store.INIT);
this.currentState = this.reducer.reduce(currentState, redux.api.Store.INIT);
}

@Override
Expand Down Expand Up @@ -82,11 +87,11 @@ private void startReducing() {
isReducing.set(true);
}

public static class Creator<S> implements redux.api.Store.Creator<S> {
public static class Creator implements redux.api.Store.Creator {

@Override
public redux.api.Store<S> create(Reducer<S> reducer, S initialState) {
return new Store<S>(reducer, initialState);
public <S> redux.api.Store<S> create(Reducer<S> reducer, S initialState) {
return new Store<>(reducer, initialState);
}
}
}
4 changes: 2 additions & 2 deletions lib/src/test/java/com/glung/redux/MiddlewaresTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@
public class MiddlewaresTest {

@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock private redux.api.Store.Creator<State> storeCreator;
@Mock private redux.api.Store.Creator storeCreator;
@Mock private Store<State> storeMock;

private final List<String> callOrderResult = new ArrayList<>();

private Store.Creator<State> enhancedStoreCreator() {
private Store.Creator enhancedStoreCreator() {
when(storeCreator.create(any(Reducer.class), any(State.class))).thenReturn(storeMock);

return applyMiddlewares(createMiddleware("ONE"),
Expand Down
6 changes: 4 additions & 2 deletions lib/src/test/java/com/glung/redux/StoreTest.java
Original file line number Diff line number Diff line change
@@ -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 <S> redux.api.Store createStore(Reducer<S> reducer, S state) {
return new Store.Creator<S>().create(reducer, state);
public <S> redux.api.Store<S> createStore(@NotNull Reducer<S> reducer, @NotNull S state) {
return new Store.Creator().create(reducer, state);
}
}

0 comments on commit e1c7bb3

Please sign in to comment.