/** Check if this Next contains effects. */ public final boolean hasEffects() { return !effects().isEmpty(); }
/** Check if this Next contains effects. */ public final boolean hasEffects() { return !effects().isEmpty(); }
@Override protected boolean matchesSafely(Next<M, F> item, Description mismatchDescription) { if (!item.hasEffects()) { mismatchDescription.appendText("no effects"); return false; } else if (!matcher.matches(item.effects())) { mismatchDescription.appendText("bad effects: "); matcher.describeMismatch(item.effects(), mismatchDescription); return false; } else { mismatchDescription.appendText("has effects: "); matcher.describeMismatch(item.effects(), mismatchDescription); return true; } }
@Override public void afterUpdate(M model, E event, Next<M, F> result) { if (result.hasModel()) { LOGGER.debug(LOGGING_PREFIX + "Model updated: {}", loggingTag, result.modelUnsafe()); } for (F effect : result.effects()) { LOGGER.debug(LOGGING_PREFIX + "Effect dispatched: {}", loggingTag, effect); } }
@Override public void afterUpdate(M model, E event, Next<M, F> result) { if (result.hasModel()) { Log.d(tag, "Model updated: " + result.modelUnsafe()); } for (F effect : result.effects()) { Log.d(tag, "Effect dispatched: " + effect); } }
synchronized void update(E event) { if (!initialised) { eventsReceivedBeforeInit.add(event); return; } Next<M, F> next = store.update(event); next.ifHasModel( new Consumer<M>() { @Override public void accept(M model) { dispatchModel(model); } }); dispatchEffects(next.effects()); }
synchronized void update(E event) { if (!initialised) { eventsReceivedBeforeInit.add(event); return; } Next<M, F> next = store.update(event); next.ifHasModel( new Consumer<M>() { @Override public void accept(M model) { dispatchModel(model); } }); dispatchEffects(next.effects()); }
@Test public void shouldNotBeSensitiveToExternalMutation() throws Exception { Set<String> inputs = new HashSet<>(); inputs.add("in"); Next<String, String> next = Next.next("#", inputs); inputs.add("don't want to see this one"); assertThat(next.effects(), equalTo((Set) Sets.newHashSet("in"))); }
@Test public void canMergeInnerEffects() throws Exception { Next<String, String> outerNext = Next.next("m", effects("f1", "f2")); Next<?, String> innerNext = dispatch(effects("f2", "f3")); Next<String, String> merged = Next.next( outerNext.modelOrElse("fail"), unionSets(innerNext.effects(), outerNext.effects())); assertEquals(Next.next("m", effects("f1", "f2", "f3")), merged); }
@Nonnull public final Next<M, F> update(M model, E event) { MI innerModel = checkNotNull(modelExtractor().apply(model)); EI innerEvent = checkNotNull(eventExtractor().apply(event)); Next<MI, FI> innerNext = checkNotNull(innerUpdate().update(innerModel, innerEvent)); M newModel = model; boolean modelUpdated = innerNext.hasModel(); if (modelUpdated) { newModel = checkNotNull(modelUpdater().apply(model, innerNext.modelUnsafe())); } return checkNotNull( innerEffectHandler().handleInnerEffects(newModel, modelUpdated, innerNext.effects())); }
@Test public void canMergeInnerEffectsAndModel() throws Exception { Set<String> effects = setOf("f1", "f2"); Next<Integer, String> innerNext = Next.next(1, effects("f2", "f3")); Next<String, String> merged = Next.next("m" + innerNext.modelOrElse(0), unionSets(effects, innerNext.effects())); assertEquals(Next.next("m1", effects("f1", "f2", "f3")), merged); }