Pith - kiln
kiln/app/src/main/java/com/vgmlr/kiln/KilnButton.kt [2.6 kb]
Modified: 00:02:27 153 026 (19 Aug 026)
5 Days Ago
package com.vgmlr.kiln

import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey

enum class KilnButtonKind(val value: Int, val label: String) {
    PERIOD(0, "Period"),
    NOT_PERIOD(1, "Not-Period");

    companion object {
        val LABELS: List<String> = entries.map { it.label }
        fun of(value: Int): KilnButtonKind = entries.firstOrNull { it.value == value } ?: NOT_PERIOD
        fun ofLabel(label: String): KilnButtonKind =
            entries.firstOrNull { it.label == label } ?: NOT_PERIOD
    }
}

@Entity(
    tableName = "button",
    foreignKeys = [ForeignKey(
        entity = KilnAccount::class,
        parentColumns = ["id"],
        childColumns = ["accountId"],
        onDelete = ForeignKey.CASCADE
    )],
    indices = [Index("accountId")]
)
data class KilnButton(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    val accountId: Long,
    val label: String,
    val kind: Int = KilnButtonKind.NOT_PERIOD.value,
    val sort: Int = 0
) {
    val kindEnum get() = KilnButtonKind.of(kind)
}

object KilnDefaultButtons {
    private val SPEC = listOf(
        "Tampons" to KilnButtonKind.PERIOD,
        "Pads" to KilnButtonKind.PERIOD,
        "Liners" to KilnButtonKind.PERIOD,
        "Cup" to KilnButtonKind.PERIOD,
        "Heating Pad" to KilnButtonKind.PERIOD,
        "Bleeding" to KilnButtonKind.PERIOD,
        "Cramps" to KilnButtonKind.NOT_PERIOD,
        "Bloating" to KilnButtonKind.NOT_PERIOD,
        "Cravings" to KilnButtonKind.NOT_PERIOD,
        "Irritability" to KilnButtonKind.NOT_PERIOD,
        "Fatigue" to KilnButtonKind.NOT_PERIOD,
        "Tenderness" to KilnButtonKind.NOT_PERIOD,
        "Headache" to KilnButtonKind.NOT_PERIOD
    )

    fun forAccount(accountId: Long): List<KilnButton> =
        SPEC.mapIndexed { i, (label, kind) ->
            KilnButton(accountId = accountId, label = label, kind = kind.value, sort = i)
        }
}

class KilnButtonSet(buttons: List<KilnButton>) {
    private val period = buttons.filter { it.kind == KilnButtonKind.PERIOD.value }
        .mapTo(HashSet(), KilnButton::id)
    private val notPeriod = buttons.filter { it.kind == KilnButtonKind.NOT_PERIOD.value }
        .mapTo(HashSet(), KilnButton::id)

    fun isPeriodSighting(record: KilnDayRecord): Boolean = record.checked.any { it in period }
    fun symptomCount(record: KilnDayRecord): Int = record.checked.count { it in notPeriod }
    fun hasSymptom(record: KilnDayRecord): Boolean = symptomCount(record) > 0

    companion object {
        val EMPTY = KilnButtonSet(emptyList())
    }
}
Updates
Kerf - Android 157.026
Kiln - Android 157.026
Wedge - Android 156.026
Whittle - Linux 155.026
Grit - Firefox/Chrome 154.026

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)
0.00543
256,892 (+146)