Skip to content

Instantly share code, notes, and snippets.

View JorgeCastilloPrz's full-sized avatar
🎉
Mostly Android stuff now, also FP

Jorge Castillo JorgeCastilloPrz

🎉
Mostly Android stuff now, also FP
View GitHub Profile
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicDataSources.kt
Created July 30, 2018 17:37
PolymorphicDataSources.kt
class LocalDataSource<F>(A: ApplicativeError<F, Throwable>) :
DataSource<F>, ApplicativeError<F, Throwable> by A {
private val localCache: Map<User, List<Task>> =
mapOf(User(UserId("user1")) to listOf(Task("LocalTask assigned to user1")))
override fun allTasksByUser(user: User): Kind<F, List<Task>> =
Option.fromNullable(localCache[user]).fold(
{ raiseError(UserNotInLocalStorage(user)) },
{ just(it) }
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicDataSource.kt
Created July 30, 2018 17:30
PolymorphicDataSource.kt
interface DataSource<F> {
fun allTasksByUser(user: User): Kind<F, List<Task>>
}
object test {
@JvmStatic
fun main(args: Array<String>): Unit {
val user1 = User(UserId("user1"))
val user2 = User(UserId("user2"))
val user3 = User(UserId("unknown user"))
val dependenciesModule = Module()
dependenciesModule.run {
class Module {
private val localDataSource: LocalDataSource = LocalDataSource()
private val remoteDataSource: RemoteDataSource = RemoteDataSource()
val repository: TaskRepository = TaskRepository(localDataSource, remoteDataSource)
}
@JorgeCastilloPrz
JorgeCastilloPrz / RxTaskRepository.kt
Last active July 30, 2018 16:38
RxTaskRepository
class TaskRepository(private val localDS: DataSource,
private val remoteDS: RemoteDataSource) {
fun allTasksByUser(user: User): Observable<List<Task>> =
localDS.allTasksByUser(user)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.onErrorResumeNext { _: Throwable -> remoteDS.allTasksByUser(user) }
}
@JorgeCastilloPrz
JorgeCastilloPrz / DataSources.kt
Last active July 30, 2018 16:20
RxDataSources
class LocalDataSource : DataSource {
private val localCache: Map<User, List<Task>> =
mapOf(User(UserId("user1")) to listOf(Task("LocalTask assigned to user1")))
override fun allTasksByUser(user: User): Observable<List<Task>> =
Observable.create { emitter ->
val cachedUser = localCache[user]
if (cachedUser != null) {
emitter.onNext(cachedUser)
} else {
interface DataSource {
fun allTasksByUser(user: User): Observable<List<Task>>
}
@JorgeCastilloPrz
JorgeCastilloPrz / RxApp.kt
Created July 30, 2018 16:14
Sample snippet for a canonical problem resolved using RxJava
interface DataSource {
fun allTasksByUser(user: User): Observable<List<Task>>
}
class LocalDataSource : DataSource {
private val localCache: Map<User, List<Task>> =
mapOf(User(UserId("user1")) to listOf(Task("LocalTask assigned to user1")))
override fun allTasksByUser(user: User): Observable<List<Task>> = Observable.create { emitter ->
val cachedUser = localCache[user]
@JorgeCastilloPrz
JorgeCastilloPrz / MonadBindingSample.kt
Created November 10, 2017 20:59
gist for blog snippet
fun getCountryCode(maybePerson : Either<BizError, Person>): Either<BizError, String> =
Either.monadError<BizError>().binding {
val person = maybePerson.bind()
val address = person.address.toEither({ AddressNotFound(person.id) }).bind()
val country = address.country.toEither({ CountryNotFound(address.id) }).bind()
yields(country.code)
}.ev()
@JorgeCastilloPrz
JorgeCastilloPrz / memoize.kt
Last active March 2, 2018 08:53
kotlinmemoize for a friend
class Memoize1<in T, out R>(val f: (T) -> R) : (T) -> R {
private val values = mutableMapOf<T, R>()
override fun invoke(x: T): R {
return values.getOrPut(x, { f(x) })
}
}
fun <T, R> ((T) -> R).memoize(): (T) -> R = Memoize1(this)
val memoizedSumFactors = { x: Int -> sumOfFactors(x) }.memoize()