Skip to content

Instantly share code, notes, and snippets.

@bastman
bastman / railway.kt
Created July 27, 2023 14:57
railway-oriented-programming (kotlin, playgorund)
package com.example.demo
// based on ...
// https://www.reddit.com/r/Kotlin/comments/15b16px/little_example_of_railway_oriented_programming_in/
// https://github.com/GabrielLasso/Kotlin-railway-example
fun main() {
val pipeline: (data: Either<Throwable, Person>) -> Either<Throwable, Response> =
(::validate `→` ::save `→` ::notify `→` ::buildResponse)
@bastman
bastman / InstantRangeDeserializer.kt
Last active August 3, 2022 09:27
jackson-module-kotlin: InstantRangeDeserializer - How to deserialize ClosedRange<Instant> - fix: Cannot construct instance of `kotlin.ranges.ClosedRange`
/*
InstantRangeDeserializer.kt
jackson-module-kotlin: InstantRangeDeserializer - How to deserialize ClosedRange<Instant>
Type definition error: [simple type, class kotlin.ranges.ClosedRange];
nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of `kotlin.ranges.ClosedRange` (no Creators, like default constructor, exist):
@bastman
bastman / SlidingWindowExamples.kt
Last active December 14, 2021 07:46
sliding-window-algorithm-technique: examples (kotlin)
// see: https://itnext.io/sliding-window-algorithm-technique-6001d5fbe8b3
fun main() {
intro()
`Maximum sum subarray of Size k`()
//`Count Occurrences of Anagram`()
}
fun intro() {
@bastman
bastman / JacksonJmesPathExt.kt
Created August 4, 2021 06:44
jmespath extensions for jackson
fun ObjectMapper.convertValueAsJsonNode(value:Any?):JsonNode = convertValue(value, JsonNode::class.java)
inline fun <reified T> JsonNode.jq(
query: String,
noinline convert: (Any) -> T
): T {
val isNullable: Boolean = null is T
try {
val expression: Expression<JsonNode> = JmesPathJackson.compile(query)
@bastman
bastman / DoubleExt.kt
Last active July 27, 2021 07:06
fun Double.round(decimals:Int)
// see discussion on alternatives here: https://discuss.kotlinlang.org/t/how-do-you-round-a-number-to-n-decimal-places/8843/15
fun Double.round(decimals:Int, roundingMode:RoundingMode=RoundingMode.HALF_EVEN):Double =
toBigDecimal().setScale(decimals, roundingMode).toDouble()
# ???
fun Double.round2(decimals: Int): Double {
val locale:Locale = Locale.US
val aTxt:String = String.format(locale, "%.${decimals+1}f", this)
val aDouble:Double = aTxt.toDouble()
@bastman
bastman / jmespath-groupBy.kt
Created July 14, 2021 10:41
groupBy impl for JMESPath (proof-of-concept)
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node.ArrayNode
import com.fasterxml.jackson.databind.node.JsonNodeFactory
import com.fasterxml.jackson.databind.node.ObjectNode
import io.burt.jmespath.Adapter
import io.burt.jmespath.JmesPath
import io.burt.jmespath.JmesPathType
import io.burt.jmespath.RuntimeConfiguration
import io.burt.jmespath.function.ArgumentConstraints
import io.burt.jmespath.function.BaseFunction
@bastman
bastman / find_duplicate_row_ids.sql
Last active June 25, 2020 07:49
postgres: explore primary keys
SELECT my_id, COUNT(my_id)
FROM my_table
GROUP BY my_id
HAVING COUNT(my_id) > 1;
@bastman
bastman / k8s-create-job-from-cronjob.sh
Last active June 16, 2020 07:04
k8s create job from cronjob (how to run a cronjob now + once)
$ kubectl create job --from=cronjob/<CRONJOB-NAME> <NEW-JOB-NAME>
e.g.:
$ kubectl create job --from=cronjob/my-cron my-cron-manual-001
function k8s-cronjob-run() {
source_cronjob_name=$1
[ -z "$source_cronjob_name" ] && echo "Please provide source-cronjob-name !" && return
sink_run_id=$(date -u +"%Y-%m-%dt%H.%M.%Sz")