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 / MaybeRuntimeTest.kt
Created July 31, 2018 10:56
MaybeRuntimeTest.kt
@JvmStatic
fun main(args: Array<String>): Unit {
val user1 = User(UserId("user1"))
val user2 = User(UserId("user2"))
val user3 = User(UserId("unknown user"))
val maybeModule = Module(MaybeK.async())
maybeModule.run {
repository.allTasksByUser(user1).fix().maybe.subscribe({ println(it) }, { println(it) })
repository.allTasksByUser(user2).fix().maybe.subscribe({ println(it) }, { println(it) })
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicModuleF.kt
Created July 31, 2018 10:48
PolymorphicModuleF.kt
class Module<F>(A: Async<F>) {
private val localDataSource: LocalDataSource<F> = LocalDataSource(A)
private val remoteDataSource: RemoteDataSource<F> = RemoteDataSource(A)
val repository: TaskRepository<F> =
TaskRepository(localDataSource, remoteDataSource, A)
}
@JorgeCastilloPrz
JorgeCastilloPrz / RuntimeSingleTest.kt
Last active July 31, 2018 10:46
RuntimeSingleTest.kt
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 singleModule = Module(SingleK.async())
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicFunctionallTasksByUser.kt
Created July 31, 2018 10:37
PolymorphicFunctionallTasksByUser.kt
fun allTasksByUser(user: User): Kind<F, List<Task>> =
localDS.allTasksByUser(user).handleErrorWith {
when (it) {
is UserNotInLocalStorage -> remoteDS.allTasksByUser(user)
else -> raiseError(UnknownError(it))
}
}
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicTaskRepository.kt
Created July 31, 2018 10:34
PolymorphicTaskRepository.kt
class TaskRepository<F>(
private val localDS: DataSource<F>,
private val remoteDS: RemoteDataSource<F>,
AE: ApplicativeError<F, Throwable>) : ApplicativeError<F, Throwable> by AE {
fun allTasksByUser(user: User): Kind<F, List<Task>> =
localDS.allTasksByUser(user).handleErrorWith {
when (it) {
is UserNotInLocalStorage -> remoteDS.allTasksByUser(user)
else -> raiseError(UnknownError(it))
@JorgeCastilloPrz
JorgeCastilloPrz / allTasksByUserAsync.kt
Last active July 31, 2018 11:32
allTasksByUserAsync.kt
override fun allTasksByUser(user: User): Kind<F, List<Task>> =
async { callback: (Either<Throwable, List<Task>>) -> Unit ->
Option.fromNullable(internetStorage[user]).fold(
{ callback(UserNotInRemoteStorage(user).left()) },
{ callback(it.right()) }
)
}
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicRemoteDataSource.kt
Last active July 31, 2018 11:31
PolymorphicRemoteDataSource.kt
class RemoteDataSource<F>(A: Async<F>) : DataSource<F>, Async<F> by A {
private val internetStorage: Map<User, List<Task>> =
mapOf(User(UserId("user2")) to listOf(Task("Remote Task assigned to user2")))
override fun allTasksByUser(user: User): Kind<F, List<Task>> =
async { callback: (Either<Throwable, List<Task>>) -> Unit ->
Option.fromNullable(internetStorage[user]).fold(
{ callback(UserNotInRemoteStorage(user).left()) },
{ callback(it.right()) }
)
@JorgeCastilloPrz
JorgeCastilloPrz / LocalDataSourceDeclaration.kt
Created July 30, 2018 18:18
LocalDataSourceDeclaration.kt
class LocalDataSource<F>(A: ApplicativeError<F, Throwable>) :
DataSource<F>, ApplicativeError<F, Throwable> by A {
override fun allTasksByUser(user: User): Kind<F, List<Task>> =
Option.fromNullable(localCache[user]).fold(
{ raiseError(UserNotInLocalStorage(user)) },
{ just(it) }
)
@JorgeCastilloPrz
JorgeCastilloPrz / PolymorphicLocalDataSource.kt
Created July 30, 2018 17:39
PolymorphicLocalDataSource.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) }