Skip to content

Instantly share code, notes, and snippets.

@hrules6872
hrules6872 / KotlinExt.kt
Created October 2, 2022 13:15
Map It Please for Kotlin
/**
* Map it please. Returns a list containing the results of applying the
* given transform function to each element in the original collection.
*
* OP: https://twitter.com/jeranfox/status/1575133458631999488
*/
inline fun <TYPE, RESULT> Iterable<TYPE>.mip(transform: TYPE.() -> RESULT): List<RESULT> = map { it.transform() }
/** before:
* users.map { it.firstName }
@hrules6872
hrules6872 / SealedClassExt.kt
Last active September 22, 2022 16:01
safeOf(): returns the first subclass of a Sealed Class matching the given [predicate], or [default] if no such element was found / values(): list all subclasses (Kotlin)
fun <T : Any> KClass<T>.safeOf(default: T, predicate: (T) -> Boolean): T = this.values().find { predicate(it) } ?: default
fun <T : Any> KClass<T>.values(): List<T> {
if (!this.isSealed) throw IllegalCallerException("Receiver MUST be a Sealed class")
return this.sealedSubclasses.map { sealedSubclass ->
when {
sealedSubclass.objectInstance != null -> sealedSubclass.objectInstance!!
else -> try {
sealedSubclass.primaryConstructor?.callBy(mapOf()) ?: throw Exception()
} catch (ignored: Exception) {
@hrules6872
hrules6872 / obsidian-tables-horizontal-scrolling.css
Created August 22, 2022 15:59
Adds horizontal scrolling to tables in Obsidian Notes
/* Adds horizontal scrolling to tables in Obsidian Notes. Tested in Obsidian v0.15.9
See also: https://forum.obsidian.md/t/css-horizontal-scrolling-tables/26581/4
*/
/* in preview / read mode */
.markdown-preview-view table ,
.markdown-source-view table {
display: block; /* This is needed for scrollbar */
width: 100%;
max-width: -moz-max-content;
@hrules6872
hrules6872 / obsidian-vii-adjustable-readable-line-length.css
Last active May 15, 2023 06:33 — forked from vii33/obsidian-vii-adjustable-readable-line-length.css
Changes the readable line length in Obsidian Notes
/* Changes the readable line length in Obsidian Notes. Tested in Obsidian v0.15.9
See also: https://forum.obsidian.md/t/adjustable-readable-line-length/7564/6
Note: For this the "readable line length" property in settings has to be enabled
(as expected). 700px width is the application's default, adjust all numbers below.
Pixel (or percentage) as a unit enables a width independent from the number of characters
(good when adjusting zoom level / font size). For fixed amount of characters use rem */
:root {
@hrules6872
hrules6872 / ZipManager.kt
Created April 16, 2022 17:43
Zip/Unzip functions in Kotlin
object ZipManager {
fun zip(files: List<String>, outputStream: OutputStream): Boolean = try {
ZipOutputStream(BufferedOutputStream(outputStream)).use { stream ->
for (file in files) {
BufferedInputStream(FileInputStream(File(file))).use { origin ->
stream.putNextEntry(ZipEntry(file.substring(file.lastIndexOf("/") + 1)))
origin.copyTo(stream)
}
}
}
@hrules6872
hrules6872 / CircleView.kt
Created January 12, 2022 17:57
Circle View for Android in Kotlin
class CircleView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) {
private val paint by lazy { Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL } }
@ColorInt
var color: Int = Color.TRANSPARENT
set(value) {
field = value
invalidate()
}
@hrules6872
hrules6872 / TriangleView.kt
Last active January 12, 2022 18:15
Triangle View for Android in Kotlin
class TriangleView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) {
private val paint by lazy { Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL } }
private val path: Path = Path()
@ColorInt
var color: Int = Color.TRANSPARENT
set(value) {
field = value
invalidate()
}
@hrules6872
hrules6872 / TimeAgo.kt
Created November 26, 2021 15:27
Destructuring a Date into Years, Months, Weeks, Days, Hours, Minutes and Seconds in Kotlin
object TimeAgo {
fun toRelative(millis: Long, spans: List<Span>): Map<Span, Long> {
var millisMutable = millis
return spans.sortedBy(Span::order).associateWith { span ->
val timeDelta: Long = millisMutable / span.millis
if (timeDelta.isGreaterThanZero()) millisMutable -= span.millis * timeDelta
timeDelta
}
}
@hrules6872
hrules6872 / FixedColumnsHorizontalGridLayoutManager.kt
Created January 27, 2021 18:32
Android FixedColumnsHorizontalGridLayoutManager
class FixedColumnsHorizontalGridLayoutManager(context: Context?, spanCountVertical: Int, private var columns: Int, orientation: Int, reverseLayout: Boolean) :
GridLayoutManager(context, spanCountVertical, orientation, reverseLayout) {
private val safeWidth: Int
get() = width - paddingRight - paddingLeft
override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams = spanLayoutSize(super.generateDefaultLayoutParams())
override fun generateLayoutParams(context: Context, attrs: AttributeSet): RecyclerView.LayoutParams = spanLayoutSize(super.generateLayoutParams(context, attrs))
override fun generateLayoutParams(layoutParams: ViewGroup.LayoutParams): RecyclerView.LayoutParams = spanLayoutSize(super.generateLayoutParams(layoutParams))
@hrules6872
hrules6872 / Modules.kt
Last active May 8, 2023 12:42
Yet another Koin killer :)
/*
* Copyright (c) 2022. Héctor de Isidro - hrules6872
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software