Skip to content

Instantly share code, notes, and snippets.

View beigirad's full-sized avatar

Farhad Beigirad beigirad

View GitHub Profile
@beigirad
beigirad / DelegatingAdapter.kt
Last active September 19, 2023 12:18
Moshi Json Adapter for Koltinx Immutable List/Collection
package com.example
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonAdapter.Factory
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import com.squareup.moshi.Types
import com.squareup.moshi.rawType
import kotlinx.collections.immutable.ImmutableList
@beigirad
beigirad / working-timesheet-generator.kt
Last active July 14, 2023 14:51
working timesheet csv generator
import java.io.BufferedWriter
import java.io.File
import java.io.FileWriter
import java.io.Writer
import kotlin.random.Random
val weekOffset = 5
val holidays = setOf(8, 16)
val month = 4
val year = 1402
@beigirad
beigirad / script.kt
Last active July 16, 2022 16:41
Moshi to kotlinx.serialization model convertor script
import java.io.File
val importPattern = "import com\\.squareup\\.moshi\\.JsonClass".toRegex()
val jsonAttrPattern = "^(.*)\\@Json\\(name \\= (\".*\")\\)".toRegex()
val jsonClassPattern = "^(.*)\\@JsonClass\\(generateAdapter \\= true\\)".toRegex()
val root = File("/Users/farhad/Projects/Otgahak/Host")
root.walkTopDown()
.filter { it.extension == "kt" }
.filter { it.readText().contains(importPattern) }
@beigirad
beigirad / 1. StateModel.kt
Created December 2, 2020 19:16
Single State Pattern
data class StateModel(
val detail: ViewResource<Entity1>,
val something: Entity2?,
val error: Event<String>?
) {
companion object {
val initial = StateModel(
detail = ViewResource.NotAvailable,
something = null,
error = null
@beigirad
beigirad / LoadingButtonExtension
Last active August 14, 2020 17:27 — forked from dmide/CircularProgressDrawable.java
a workaround for showing progress on material button
import android.graphics.Color
import android.graphics.drawable.Drawable
import com.example.CircularProgressDrawable
import com.google.android.material.button.MaterialButton
var MaterialButton.isLoading: Boolean
get() = getTag(id.hashCode()) != null
set(value) {
val isLoadingHash = id.hashCode() // has used in isLoading#getter function
@beigirad
beigirad / scope on constructor
Created July 24, 2020 15:27
dagger component scope types
@Module
interface DataModule {
@Binds
fun bindSessionProvider(sessionProvider: SessionProviderImpl): SessionProvider
}
@Singleton
class SessionProviderImpl @Inject constructor(
private val application: Application
) : SessionProvider
@beigirad
beigirad / formatter
Last active April 8, 2020 12:39
price formatter
/*
expected functionality:
// 1002.0 -> 1,002
// 1002.1 -> 1,002.10
// 1002.666 -> 1,002.66
*/
fun legacyFormatPrice(value: Double) {
return if (this.rem(1) == 0.0)
String.format("%,.0f", value)
else
@beigirad
beigirad / SampleValidator.kt
Created October 29, 2019 17:58
validation method
class SampleValidator(
val balance: Long?,
val amount: Long?,
val acceptedTerms: Boolean?
) : Validator<SampleValidator> {
override fun validate(): Validation<SampleValidator> {
return when {
balance ?: 0 <= 0 -> Validation.Invalid("بالانس شما کافی نیست")
amount ?: 0 <= 0 -> Validation.Invalid("مبلغ وارد شده صحیح نیست")
amount ?: 0 > balance ?: 0 -> Validation.Invalid("مبلغ وارد شده بیشتر از بالانس شماست")
@beigirad
beigirad / Logcat filters
Last active April 11, 2019 14:35
To clean-up logcat console, use this expression for ignore some tags
^(?!(chatty|ConfigStore|system_server|OpenGLRenderer|girad.threadin|EGL_emulation))
@beigirad
beigirad / java file
Last active November 29, 2018 21:33
kotlin vs. java Generics
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
public final class Test {
public final void s() {
RequestProvider.Production production1 = new FoodStore();
RequestProvider.Production production2 = new FastFoodStore();
RequestProvider.Production production3 = new InOutBurger();
}