Skip to content

Instantly share code, notes, and snippets.

View ZakTaccardi's full-sized avatar

Zak Taccardi ZakTaccardi

View GitHub Profile
@ZakTaccardi
ZakTaccardi / StaleDataObservatory.kt
Last active January 5, 2017 16:55
Refresh data on an interval, as long as your data set has a subscriber.
/**
* Handles checking when data should be considered stale, and invokes a function to refresh data.
*
*/
@DataScope class StaleDataObservatory(
/**
* Duration the data is considered "fresh"
*/
syncInterval: Long,
@ZakTaccardi
ZakTaccardi / CartControllerImpl.java
Last active January 10, 2017 19:23
A controller that loads a shopping cart (think online shopping).
/**
* A controller that loads a shopping cart (think online shopping).
*/
public class CartControllerImpl implements CartController {
final CartModel model;
final TaxModel taxModel;
final CurrencyUnit currencyUnit;
final MoneyFormatter moneyFormatter;
final RxBus rxBus;
@ZakTaccardi
ZakTaccardi / ScanMap.kt
Last active January 20, 2017 21:25
ScanMap - an operator that allows you to run a function over an emission and its previous emission. This function can map to a different type, unlike `.scan()`
fun <T, R> Observable<T>.scanMap(func2: (T?, T) -> R): Observable<R> {
return this.startWith(null as T?) //emit a null value first, otherwise the .buffer() below won't emit at first (needs 2 emissions to emit)
.buffer(2, 1) //buffer the previous and current emission
.filter { it.size >= 2 }
.map { func2.invoke(it[0], it[1]) }
}
fun <T, R> Observable<T>.scanMap(initialValue: T, func2: (T, T) -> R): Observable<R> {
return this.startWith(initialValue) //use initially provided value instead of null
.buffer(2, 1)
@ZakTaccardi
ZakTaccardi / KotlinExtensionTest.kt
Created February 20, 2017 16:45
Making tests more readable with Kotlin’s extension functions
@Test
fun testClear() {
clickNumber(1)
clickNumber(2)
clickNumber(3)
state.assertValue(123)
longPressClear()
state.assertValue(0)
}
@ZakTaccardi
ZakTaccardi / DealCardsUi.kt
Last active March 29, 2017 22:18
DealCardsUi
/**
* The user interface for dealing cards.
*
* @see DealCardsActivity
*/
interface DealCardsUi : StateRenderer<DealCardsUi.State> {
val state: State
override fun render(state: State)
@ZakTaccardi
ZakTaccardi / Crossfader.kt
Last active April 11, 2017 19:35
Animate between multiple views, allowing only one view to be visible at a time.
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.content.Context
import android.view.View
import android.view.ViewGroup
/**
* Animates a view between its states.
*
* Currently only supports crossfading.
class TemporalCoupling {
fun incorrectUsageOfBadApi() {
val badApi: BadApi = BadApi()
badApi.username = "Zak"
badApi.password = "temporalCouplingIsBad_123"
badApi.login() //throws an NullPointerException
}
@ZakTaccardi
ZakTaccardi / FizzBuzzTest.java
Created April 17, 2017 20:39
A fizz buzz that uses algebraic data types
import org.junit.Test;
import java.util.function.Consumer;
/**
* Note: no actual assertions are done here.
*/
public class FizzBuzzTest {
static void defaultPrint(BaseFizzBuzz base) {
package com.example.taccardi.zak;
import android.support.annotation.NonNull;
import io.reactivex.Observable;
/**
* Use this class to lock (prevent charges to it) or unlock (allow charges) a card.
*/
interface CardLockRepository {
@ZakTaccardi
ZakTaccardi / ObservingState.kt
Created July 6, 2017 16:59
Exposing Information: Observing Events vs State (in Rx)
class UserRepository{
// note: hot observables that do not replay missed events
fun logins(): Observable<User>
fun logouts(): Observable<Unit>
}
/**
* An abstract user with two implementations:
* "LoggedIn" and "Logged out"
*/