Ivan “CLOVIS” Canet's Avatar

Ivan “CLOVIS” Canet

@ivcanet.bsky.social

Kotlin developer & teacher @ 4SH, learn more about me: ivan.canet.dev Open source at https://opensavvy.dev • @opensavvy.techhub.social.ap.brid.gy Organizing the Kotlin Bordeaux User Group at https://bordeauxkt.io

321 Followers  |  231 Following  |  821 Posts  |  Joined: 14.09.2023  |  2.0879

Latest posts by ivcanet.bsky.social on Bluesky

Tomorrow is already #bdxio, for its 10 year anniversary!

You'll find me at the Grappe Numerique booth, organizing new secret events with other local user groups... come and see what's up!

06.11.2025 18:53 — 👍 2    🔁 0    💬 0    📌 0

I'm curious to get a more detailed argument 👀

04.11.2025 17:40 — 👍 0    🔁 0    💬 0    📌 0
This set of representations for a same value is called a cohort. Zero has 12288 possible representations (24576 if both signed zeros are included, in two different cohorts).

This set of representations for a same value is called a cohort. Zero has 12288 possible representations (24576 if both signed zeros are included, in two different cohorts).

great

01.11.2025 18:20 — 👍 1    🔁 0    💬 0    📌 0
@KtorDsl
@JvmName("routeOrRaise6")
inline fun <reified In : Any, reified Out : Any, reified F1 : Any, reified F2 : Any, reified F3 : Any, reified F4 : Any, reified F5 : Any, reified F6 : Any, reified Params : Parameters> Route.routeWithRaise(
	endpoint: Endpoint<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>,
	crossinline block: suspend context(Raise<F1>, Raise<F2>, Raise<F3>, Raise<F4>, Raise<F5>, Raise<F6>) TypedResponseScope<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>.() -> Unit,
) {
	route(endpoint) response@{
		recover(
			block = {
				recover(
					block = {
						recover(
							block = {
								recover(
									block = {
										recover(
											block = {
												recover(
													block = { block() },
													recover = { it: F6 -> fail(it) }
												)
											},
											recover = { it: F5 -> fail(it) }
										)
									},
									recover = { it: F4 -> fail(it) }
								)
							},
							recover = { it: F3 -> fail(it) }
						)
					},
					recover = { it: F2 -> fail(it) }
				)
			},
			recover = { it: F1 -> fail(it) }
		)
	}
}

@KtorDsl @JvmName("routeOrRaise6") inline fun <reified In : Any, reified Out : Any, reified F1 : Any, reified F2 : Any, reified F3 : Any, reified F4 : Any, reified F5 : Any, reified F6 : Any, reified Params : Parameters> Route.routeWithRaise( endpoint: Endpoint<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>, crossinline block: suspend context(Raise<F1>, Raise<F2>, Raise<F3>, Raise<F4>, Raise<F5>, Raise<F6>) TypedResponseScope<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>.() -> Unit, ) { route(endpoint) response@{ recover( block = { recover( block = { recover( block = { recover( block = { recover( block = { recover( block = { block() }, recover = { it: F6 -> fail(it) } ) }, recover = { it: F5 -> fail(it) } ) }, recover = { it: F4 -> fail(it) } ) }, recover = { it: F3 -> fail(it) } ) }, recover = { it: F2 -> fail(it) } ) }, recover = { it: F1 -> fail(it) } ) } }

Well, I am trying it out

01.11.2025 16:41 — 👍 1    🔁 0    💬 0    📌 0

@KtorDsl
@JvmName("routeOrRaise6")
inline fun <reified In : Any, reified Out : Any, reified F1 : Any, reified F2 : Any, reified F3 : Any, reified F4 : Any, reified F5 : Any, reified F6 : Any, reified Params : Parameters> Route.routeWithRaise(
	endpoint: Endpoint<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>,
	crossinline block: suspend context(Raise<F1>, Raise<F2>, Raise<F3>, Raise<F4>, Raise<F5>, Raise<F6>) TypedResponseScope<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>.() -> Unit,
) {
	route(endpoint) response@{
		recover(
			block = {
				recover(
					block = {
						recover(
							block = {
								recover(
									block = {
										recover(
											block = {
												recover(
													block = { block() },
													recover = { it: F6 -> fail(it) }
												)
											},
											recover = { it: F5 -> fail(it) }
										)
									},
									recover = { it: F4 -> fail(it) }
								)
							},
							recover = { it: F3 -> fail(it) }
						)
					},
					recover = { it: F2 -> fail(it) }
				)
			},
			recover = { it: F1 -> fail(it) }
		)
	}
}

@KtorDsl @JvmName("routeOrRaise6") inline fun <reified In : Any, reified Out : Any, reified F1 : Any, reified F2 : Any, reified F3 : Any, reified F4 : Any, reified F5 : Any, reified F6 : Any, reified Params : Parameters> Route.routeWithRaise( endpoint: Endpoint<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>, crossinline block: suspend context(Raise<F1>, Raise<F2>, Raise<F3>, Raise<F4>, Raise<F5>, Raise<F6>) TypedResponseScope<In, Out, Or<Or<Or<Or<Or<Or<*, ByCode<F1>>, ByCode<F2>>, ByCode<F3>>, ByCode<F4>>, ByCode<F5>>, ByCode<F6>>, Params>.() -> Unit, ) { route(endpoint) response@{ recover( block = { recover( block = { recover( block = { recover( block = { recover( block = { recover( block = { block() }, recover = { it: F6 -> fail(it) } ) }, recover = { it: F5 -> fail(it) } ) }, recover = { it: F4 -> fail(it) } ) }, recover = { it: F3 -> fail(it) } ) }, recover = { it: F2 -> fail(it) } ) }, recover = { it: F1 -> fail(it) } ) } }

It's getting out of hand

01.11.2025 16:40 — 👍 0    🔁 0    💬 0    📌 0

That logo is perfect! Congrats @lilywhiteout.bsky.social!

31.10.2025 10:09 — 👍 2    🔁 1    💬 0    📌 0
Post image

KtMongo 0.24.0 is out, with our new mascot, Mokodee!

This version contains new syntax sugar for $unset, and improvements to the documentation.

ktmongo.opensavvy.dev/news/2025/10...

22.10.2025 21:06 — 👍 4    🔁 2    💬 2    📌 0

Happy Halloween everyone!

31.10.2025 09:31 — 👍 6    🔁 2    💬 0    📌 0
Documents (28,760,238)

Documents (28,760,238)

Government website: "Around 15 millions entities"

Me after processing all the data:

31.10.2025 09:22 — 👍 1    🔁 0    💬 0    📌 0
Preview
crates.io: Rust Package Registry

The description says ‘Note: we are not on crates.io yet” 🙈

31.10.2025 09:16 — 👍 0    🔁 0    💬 1    📌 0
mokodee, but there is a bandage on its tail and a maple leaf on its head

mokodee, but there is a bandage on its tail and a maple leaf on its head

Also I drew mokodee for some reason so @ivcanet.bsky.social this one goes out to you

31.10.2025 05:00 — 👍 8    🔁 1    💬 1    📌 0

yeeeeeeees ♥️🎃

31.10.2025 07:20 — 👍 5    🔁 0    💬 0    📌 0
AnyEndpoint

Spine is really the project in which I torture the Kotlin spec.

If you haven't, please read the "The trick" section on this page: spine.opensavvy.dev/api-docs/api...

30.10.2025 21:05 — 👍 2    🔁 0    💬 1    📌 0
			val delete: Endpoint<Unit, Unit, FailureSpec.Or<FailureSpec.Or<FailureSpec.Never, NotFound.Companion>, NotAllowed.Companion>, Parameters.Empty> by delete()
				.failure(NotFound)
				.failure(NotAllowed)

val delete: Endpoint<Unit, Unit, FailureSpec.Or<FailureSpec.Or<FailureSpec.Never, NotFound.Companion>, NotAllowed.Companion>, Parameters.Empty> by delete() .failure(NotFound) .failure(NotAllowed)

I feel like a TypeScript developer

30.10.2025 21:00 — 👍 1    🔁 0    💬 1    📌 0

Do you think there's a max inline depth in Kotlin?

27.10.2025 21:42 — 👍 1    🔁 0    💬 1    📌 0
FailureSpec.Or<FailureSpec.Or<FailureSpec.Never, FailureSpec<NotFound>>, FailureSpec<AlreadyExists>>

FailureSpec.Or<FailureSpec.Or<FailureSpec.Never, FailureSpec<NotFound>>, FailureSpec<AlreadyExists>>

I'm cooking 👀

27.10.2025 20:59 — 👍 2    🔁 0    💬 1    📌 0

“My happy marriage”

> 2 seasons
> not married

23.10.2025 19:26 — 👍 0    🔁 0    💬 0    📌 0

Bluesky compression was not nice with this one :/

You can find high-resolution Mokodee here: gitlab.com/opensavvy/kt...

22.10.2025 21:08 — 👍 0    🔁 0    💬 0    📌 0
Post image

I love Java dates

This code fails with
```
UNEXPECTED SERVER ERROR:
Invalid value for MonthOfYear (valid values 1 - 12): 0
```

21.10.2025 15:51 — 👍 2    🔁 0    💬 0    📌 0

idk, the scene with dead frogs falling from the sky is forever burned in my memories

17.10.2025 14:40 — 👍 1    🔁 0    💬 1    📌 0

That was such a weird movie. I've seen it so many times as a child, it's a very strange memory

17.10.2025 13:12 — 👍 1    🔁 0    💬 1    📌 0

That much??? What's in it?

16.10.2025 12:00 — 👍 1    🔁 0    💬 1    📌 0
Preview
From passwords to passkeys A partially accurate historical account on how we finally arrived at passkeys as the ultimate solution to accessible and secure authentication from simple passwords.

ssg.dev/from-passwor...

16.10.2025 07:53 — 👍 0    🔁 1    💬 0    📌 0

Ah, I didn't know its name

16.10.2025 05:37 — 👍 1    🔁 0    💬 0    📌 0

Don't hesitate to fork mine, it's in Kotlin itself 👀

15.10.2025 20:48 — 👍 1    🔁 0    💬 0    📌 0

What's Rouge?

15.10.2025 20:19 — 👍 1    🔁 0    💬 1    📌 0
Post image

Yeah I understand why old people are always complaining about computers not working right

It's actually impressive how bad we are at everything

15.10.2025 20:18 — 👍 1    🔁 0    💬 0    📌 0
Post image

IntelliJ you're tired, go to sleep

15.10.2025 16:56 — 👍 1    🔁 0    💬 1    📌 0
Post image

👀

15.10.2025 15:07 — 👍 2    🔁 0    💬 1    📌 0

anyways as always tapping the "learned helplessness is a disease" sign. you must never resign yourself to stagnation and rot of mind, body, or soul

13.10.2025 16:26 — 👍 206    🔁 18    💬 4    📌 0

@ivcanet is following 19 prominent accounts