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 / tailrec2.kt
Created May 5, 2017 22:14
asdk asokd kosadokas
tailrec fun <T> filter(l: List<T>, res: List<T>, f: (T) -> Boolean): List<T> {
if (l.isEmpty()) {
return res
} else {
return filter(l.tail(), if (f(l.head())) { res + listOf(l.head())} else { res }, f)
}
}
@JorgeCastilloPrz
JorgeCastilloPrz / factorcalculatorclass.kt
Last active May 12, 2017 14:15
factor calculator class for a blog post
class FactorCalculator {
val sumCache = hashMapOf<Int, Int>()
val factorCache = hashMapOf<Int, List<Int>>()
fun sumOfFactors(number: Int) = sumCache.getOrPut(number, {
factorsOf(number).sum()
})
fun isFactor(number: Int, potential: Int) = number % potential == 0
@JorgeCastilloPrz
JorgeCastilloPrz / factorcalculatorpure.kt
Last active May 12, 2017 14:25
factorcalculatorpure.kt
fun sumOfFactors(number: Int) = factorsOf(number).sum()
fun factorsOf(number: Int) = (1 to number).toList().filter { isFactor(number, it) }
fun isFactor(number: Int, potential: Int) = number % potential == 0
@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()
@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 / 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]
interface DataSource {
fun allTasksByUser(user: User): Observable<List<Task>>
}
@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 {
@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) }
}
class Module {
private val localDataSource: LocalDataSource = LocalDataSource()
private val remoteDataSource: RemoteDataSource = RemoteDataSource()
val repository: TaskRepository = TaskRepository(localDataSource, remoteDataSource)
}