<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Scala on Dev notes</title>
    <link>https://blog.michal.pawlik.dev/tags/scala/</link>
    <description>Recent content in Scala on Dev notes</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 01 Oct 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.michal.pawlik.dev/tags/scala/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to run sbt tasks with custom settings</title>
      <link>https://blog.michal.pawlik.dev/posts/til/sbt-task-with-custom-settings/</link>
      <pubDate>Wed, 01 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/sbt-task-with-custom-settings/</guid>
      <description>&lt;p&gt;When preparing build configuration in sbt, you might want to write custom sbt task. Task in sbt is like a function that can depend on other tasks and project settings.&lt;/p&gt;&#xA;&lt;h2 id=&#34;custom-sbt-tasks&#34;&gt;Custom sbt tasks&lt;/h2&gt;&#xA;&lt;p&gt;To illustrate it, let&amp;rsquo;s write a simple task that validates environment, runs tests and builds an app&lt;/p&gt;&#xA;&lt;div class=&#34;cyber-terminal&#34;&gt;&#xA;  &lt;div class=&#34;cyber-terminal__header&#34;&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--red&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--yellow&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--green&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__title&#34;&gt;scala&lt;/span&gt;&#xA;    &lt;button class=&#34;cyber-terminal__copy&#34; type=&#34;button&#34; aria-label=&#34;Copy code&#34; data-copy&gt;&#xA;      &lt;i class=&#34;fa-regular fa-copy&#34;&gt;&lt;/i&gt;&#xA;    &lt;/button&gt;&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;cyber-terminal__body&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-scala&#34; data-lang=&#34;scala&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; sbt.&lt;span style=&#34;color:#ff79c6&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;lazy&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;val&lt;/span&gt; validateAndBuild &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; taskKey&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;Unit&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;](&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;Validates env, runs tests and builds the app&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;val&lt;/span&gt; root &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; project&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;in&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;file&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)).&lt;/span&gt;settings&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  validateAndBuild &lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    validateEnvVars&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    assembly&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;tasks-vs-immutable-settings&#34;&gt;Tasks vs immutable settings&lt;/h2&gt;&#xA;&lt;p&gt;This can be handy when the project grows in complexity. One problem with this approach is that we don&amp;rsquo;t control the inputs to the sub-tasks that we run.&#xA;In sbt, settings are initialized when the project is loaded and are not mutable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scala Tooling Spree #1 recap</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/tooling-spree-recap/</link>
      <pubDate>Fri, 31 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/tooling-spree-recap/</guid>
      <description>&lt;p&gt;On January 30, 2025, the first Scala Tooling Spree took place, and I had the pleasure of being part of it. Here’s a recap of the event. Spoiler alert: it was awesome!&lt;/p&gt;&#xA;&lt;h2 id=&#34;event-details&#34;&gt;Event details&lt;/h2&gt;&#xA;&lt;p&gt;The first Scala Tooling Spree was announced on &lt;a href=&#34;https://discord.com/channels/632642981228314653/632652693013528589/1331562385978429491&#34;&gt;Discord&lt;/a&gt; and &lt;a href=&#34;https://bsky.app/profile/michal.pawlik.dev/post/3lgq2kx7d6s2d&#34;&gt;Bluesky&lt;/a&gt;.&#xA;The event brought together 9 participants who formed 4 teams. Over the course of a 2-hour call, we tackled 4 issues, resulting in 3 pull requests. We had participants with diverse backgrounds, ranging from business application developers to tooling and compiler engineers. Each team had at least one experienced tooling maintainer, ensuring we were never short on expertise!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Understand your build structure and performance</title>
      <link>https://blog.michal.pawlik.dev/posts/til/bloop-performance-tracing/</link>
      <pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/bloop-performance-tracing/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Today I learned that you can &lt;a href=&#34;https://scalacenter.github.io/bloop/docs/performance-guide&#34;&gt;trace your build performance with bloop&lt;/a&gt;, and it&amp;rsquo;s especially easy when using Metals. The setup might not be obvious for some.&lt;/p&gt;&#xA;&lt;p&gt;When working with &lt;a href=&#34;https://www.scala-sbt.org/1.x/docs/Multi-Project.html&#34;&gt;multi-module&lt;/a&gt; projects, build times can sometimes increase unexpectedly. There are a few ways to analyze that statically, but you can always see the live data from your bloop compilation. Let&amp;rsquo;s explore those options.&lt;/p&gt;&#xA;&lt;h2 id=&#34;static-analysis&#34;&gt;Static analysis&lt;/h2&gt;&#xA;&lt;p&gt;When your &lt;code&gt;build.sbt&lt;/code&gt; file grows complex it&amp;rsquo;s easy to lose track of which depends on which. This not only creates confusion and complicates onboarding, but also to slower builds and frustration in consequence.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Useful commands for inspecting sbt build</title>
      <link>https://blog.michal.pawlik.dev/posts/til/inspecting-sbt/</link>
      <pubDate>Wed, 29 May 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/inspecting-sbt/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Today I learned a few useful commands to help you understand complex sbt builds.&lt;/p&gt;&#xA;&lt;h2 id=&#34;task-timing&#34;&gt;task timing&lt;/h2&gt;&#xA;&lt;p&gt;JAVA_OPTS=-Dsbt.task.timings=true sbt&lt;/p&gt;&#xA;&lt;h2 id=&#34;inspecting-task&#34;&gt;inspecting task&lt;/h2&gt;&#xA;&lt;p&gt;inspect module/taskName&lt;/p&gt;&#xA;&lt;h2 id=&#34;inspecting-task-tree&#34;&gt;inspecting task tree&lt;/h2&gt;&#xA;&lt;p&gt;inspect tree module/taskName&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hide irrelevant data in your PRs</title>
      <link>https://blog.michal.pawlik.dev/posts/til/cleaner-pr-diffs/</link>
      <pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/cleaner-pr-diffs/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Today I learned that you can &lt;a href=&#34;https://docs.github.com/en/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github&#34;&gt;hide irrelevant changes from Github PRs&lt;/a&gt;. The syntax for &lt;code&gt;.gitattributes&lt;/code&gt; can be tricky though.&lt;/p&gt;&#xA;&lt;p&gt;In my current project, it&amp;rsquo;s sometimes necessary to re-generate and commit a bunch of files to the repository. This can happen when you store some &lt;a href=&#34;https://en.wikipedia.org/wiki/Infrastructure_as_code&#34;&gt;IaC&lt;/a&gt; or test data in the repository.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sample-repository&#34;&gt;Sample repository&lt;/h2&gt;&#xA;&lt;p&gt;To demonstrate the problem, here&amp;rsquo;s an example repository: &lt;a href=&#34;https://github.com/majk-p/nice-pr-diffs&#34;&gt;https://github.com/majk-p/nice-pr-diffs&lt;/a&gt; that features two PRs:&lt;/p&gt;&#xA;&lt;p&gt;The first one is hard to read &lt;a href=&#34;https://github.com/majk-p/nice-pr-diffs/pull/1/files&#34;&gt;https://github.com/majk-p/nice-pr-diffs/pull/1/files&lt;/a&gt; because it features a wall of text - new testing data that has been added.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integration testing with Weaver and Localstack</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/weaver-localstack/</link>
      <pubDate>Fri, 29 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/weaver-localstack/</guid>
      <description>&lt;p&gt;When creating software that makes heavy use of cloud infrastructure, it is wise to test the integration in the end-to-end fashion. Doing so in cloud environment is one option, but it may not be viable for all cases. It can be pricy and you cannot do it in an local environment.&lt;/p&gt;&#xA;&lt;p&gt;A popular solution to this problem is to run &lt;a href=&#34;https://www.localstack.cloud/&#34;&gt;Localstack&lt;/a&gt; and test your code against it. In this post we&amp;rsquo;ll explore how to manage your Localstack resources for E2E tests using &lt;a href=&#34;https://testcontainers.com/&#34;&gt;Testcontainers&lt;/a&gt;, &lt;a href=&#34;https://typelevel.org/cats-effect/docs/std/resource&#34;&gt;Cats-effect &lt;code&gt;Resource&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://disneystreaming.github.io/weaver-test/&#34;&gt;Weaver&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to optics in Scala</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/optics/</link>
      <pubDate>Tue, 11 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/optics/</guid>
      <description>&lt;p&gt;Throughout this blog I&amp;rsquo;ve mentioned the benefits of having a strong type system a multiple times. I&amp;rsquo;ve covered &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/refined/&#34;&gt;type refinement for value validation&lt;/a&gt;, &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations/&#34;&gt;beginner friendly&lt;/a&gt; and &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations-show/&#34;&gt;advanced approach&lt;/a&gt; to type-class derivation or type-safe approach to &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/pass4s-basics/&#34;&gt;messaging with pass4s&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The possibilities are endless though, so today I want to introduce another topic, that beginners in languages like Scala or Haskell might not be aware of.&lt;/p&gt;&#xA;&lt;p&gt;In this post I&amp;rsquo;ll talk about &lt;strong&gt;Optics&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;meet-optics&#34;&gt;Meet Optics&lt;/h2&gt;&#xA;&lt;p&gt;Optics is an umbrella term for accessing and transforming immutable data. We&amp;rsquo;ll explore the world of optics with the great library &lt;a href=&#34;https://www.optics.dev/Monocle/&#34;&gt;Monocle&lt;/a&gt;. Before we get started, let&amp;rsquo;s set the stage and with some problem we can refer to.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Intermediate&#39;s guide to derivations in Scala: Magnolia</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/scala-derivations-show/</link>
      <pubDate>Sun, 07 May 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/scala-derivations-show/</guid>
      <description>&lt;p&gt;In the &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations/&#34;&gt;previous post&lt;/a&gt; about Scala derivation I&amp;rsquo;ve explained the idea of derivation and showed how we can benefit from it by using library-provided derivations. This time let&amp;rsquo;s dig deeper and implement our own derviation with &lt;a href=&#34;https://github.com/softwaremill/magnolia&#34;&gt;Magnolia&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; This post is intended for intermediate Scala users, if you are not familiar with the topic I recommend starting with the &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations/&#34;&gt;beginner introduction&lt;/a&gt; first&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;-recap&#34;&gt;♻️ Recap&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; you can skip this section if you remember the previous post, it&amp;rsquo;s just a recap&lt;/p&gt;</description>
    </item>
    <item>
      <title>Beginner&#39;s guide to derivations in Scala</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/scala-derivations/</link>
      <pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/scala-derivations/</guid>
      <description>&lt;p&gt;When learning about Scala, there are a few things that might be surprising. One of such mechanisms is code derivation. With this post I want to demystify the term for those of you who are learning Scala and functional programming in general.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; This post is intended for Scala beginners and does not go into the details of building your own derivation. Instead, it shows the client side of things, aiming to show the impact on the code simplification.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tech bytes #5 in Kraków recap</title>
      <link>https://blog.michal.pawlik.dev/posts/tech-bytes-5-krakow-recap/</link>
      <pubDate>Thu, 16 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/tech-bytes-5-krakow-recap/</guid>
      <description>&lt;p&gt;Last Thursday (13.04.2023) I had the pleasure to speak at the 5th edition of &lt;a href=&#34;https://www.meetup.com/pl-PL/tech-bytes-ocado-technology-krakow/events/292412394/&#34;&gt;Tech Bytes&lt;/a&gt; in Kraków.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; This post is a short recap of the event&lt;/p&gt;&#xA;&lt;h1 id=&#34;-the-right-tools-for-the-right-job&#34;&gt;🔧 The right tools for the right job&lt;/h1&gt;&#xA;&lt;p&gt;This edition had two talks scheduled, both focused on programming languages, specifically Scala and Elixir. &amp;ldquo;The right tools for the right job&amp;rdquo; was the topic of the meeting.&lt;/p&gt;&#xA;&lt;p&gt;The talks were:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Get rid of boilerplate with Scala&lt;/em&gt; by myself&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;What is Elixir and what it can do with concurrency challenges? - sharing Elixirator insights&lt;/em&gt; by Józef Pawlikowski and Alexander Sosnovskiy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Sadly Alexander wasn&amp;rsquo;t able to join us but Józef did his best to present his peer&amp;rsquo;s part.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Beginner&#39;s guide to toolkits in Scala</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/scala-toolkits/</link>
      <pubDate>Sat, 11 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/scala-toolkits/</guid>
      <description>&lt;p&gt;So you are learning Scala and see all the news about &lt;a href=&#34;https://scala-cli.virtuslab.org/&#34;&gt;scala-cli&lt;/a&gt; and it becoming the new &lt;a href=&#34;https://github.com/scala/improvement-proposals/pull/46&#34;&gt;scala runner&lt;/a&gt;, &lt;a href=&#34;https://github.com/scala/toolkit&#34;&gt;Scala Toolkit&lt;/a&gt;, &lt;a href=&#34;https://github.com/typelevel/toolkit&#34;&gt;Typelevel Toolkit&lt;/a&gt; and things become a little confusing?&lt;/p&gt;&#xA;&lt;p&gt;This post is here to help you understand what&amp;rsquo;s going on. To make some sense of it, let&amp;rsquo;s tell a bit of a story.&lt;/p&gt;&#xA;&lt;h2 id=&#34;-scala-runner-and-scala-cli&#34;&gt;💻 Scala runner and scala-cli&lt;/h2&gt;&#xA;&lt;p&gt;First of all, what&amp;rsquo;s Scala runner? basically it&amp;rsquo;s the program that you launch by typing &lt;code&gt;scala&lt;/code&gt; in your terminal. It can launch a basic REPL or run provided Scala file, but not much more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wrocław Scala User Group #2</title>
      <link>https://blog.michal.pawlik.dev/posts/wsug-002/</link>
      <pubDate>Sun, 29 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/wsug-002/</guid>
      <description>&lt;p&gt;In this post I want to share a short recap of first Wrocław Scala User Group (WSUG) meetup. This will be kind of TIL entry, it doesn&amp;rsquo;t aim to cover the full presentation content. If you&amp;rsquo;d like to join the next meeting, join us at &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclaw-scala-user-group/&#34;&gt;Wroclaw Scala User Group at meetup.com&lt;/a&gt;. The meetup was held in Polish so the slides are not translated.&lt;/p&gt;&#xA;&lt;h2 id=&#34;first-talk---pain-free-apis-with-smithy4s---jakub-kozłowski-kubukozhttpsgithubcomkubukoz&#34;&gt;First talk - ‘Pain-free APIs with Smithy4s’ - Jakub Kozłowski &lt;a href=&#34;https://github.com/kubukoz&#34;&gt;kubukoz&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In this talk Jakub introduced us to Smithy - an IDL (Interface Definition Language) built for defining implementation agnostic API descriptions. During the talk we have focused on the aspects that are difficult when designing and evolving a system, namely the communication problems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wrocław Java User Group</title>
      <link>https://blog.michal.pawlik.dev/posts/wjug-0198/</link>
      <pubDate>Sat, 14 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/wjug-0198/</guid>
      <description>&lt;p&gt;In this post I want to share a short recap of first Wrocław Scala Java Group (WSUG) meetup. This will be kind of TIL entry, it doesn&amp;rsquo;t aim to cover the full presentation content. You can find the full agenda at the &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclawjug/events/290615129/&#34;&gt;event page&lt;/a&gt;. If you&amp;rsquo;d like to join the next meeting, join us at &lt;a href=&#34;https://www.meetup.com/pl-PL/WroclawJUG/&#34;&gt;Wroclaw Java User Group at meetup.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;We just had one talk this time, and it was delivered by yours truly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scala type bounds - &lt;: vs &lt;:&lt;</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/type-bounds-symbols/</link>
      <pubDate>Fri, 16 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/type-bounds-symbols/</guid>
      <description>&lt;p&gt;In this short entry I want to shed some light at the difference between &lt;code&gt;&amp;lt;:&lt;/code&gt; and &lt;code&gt;&amp;lt;:&amp;lt;&lt;/code&gt; in Scala.&lt;/p&gt;&#xA;&lt;p&gt;TL;DR&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;lt;:&lt;/code&gt; is a language feature built into the compiler: upper type bound&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;lt;:&amp;lt;&lt;/code&gt; is it&amp;rsquo;s generalization: generalized type constraints - it&amp;rsquo;s provided in the standard library&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start with the first one. &lt;code&gt;&amp;lt;:&lt;/code&gt; is called the &lt;a href=&#34;https://docs.scala-lang.org/tour/upper-type-bounds.html&#34;&gt;upper type bound&lt;/a&gt;.&#xA;We use it to express type boundaries for generic types as for example here:&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Mimic value class in Typescript</title>
      <link>https://blog.michal.pawlik.dev/posts/til/value-class-typescript/</link>
      <pubDate>Thu, 15 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/value-class-typescript/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Today I learned how to mimic Scala-like value class in Typescript&lt;/p&gt;&#xA;&lt;p&gt;Doing day to day scala I often use value classes to model the data like:&lt;/p&gt;&#xA;&lt;div class=&#34;cyber-terminal&#34;&gt;&#xA;  &lt;div class=&#34;cyber-terminal__header&#34;&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--red&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--yellow&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--green&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__title&#34;&gt;scala&lt;/span&gt;&#xA;    &lt;button class=&#34;cyber-terminal__copy&#34; type=&#34;button&#34; aria-label=&#34;Copy code&#34; data-copy&gt;&#xA;      &lt;i class=&#34;fa-regular fa-copy&#34;&gt;&lt;/i&gt;&#xA;    &lt;/button&gt;&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;cyber-terminal__body&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-scala&#34; data-lang=&#34;scala&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;UserId&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;value&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#8be9fd&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;AnyVal&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;City&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;value&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#8be9fd&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;AnyVal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;This is especially useful when you want to add some meaning to primitive types. It also makes the compiler help you to avoid passing irrelevant data to downstream methods.&lt;/p&gt;&#xA;&lt;p&gt;Read more about value classes in the documentation &lt;a href=&#34;https://docs.scala-lang.org/overviews/core/value-classes.html&#34;&gt;https://docs.scala-lang.org/overviews/core/value-classes.html&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wrocław Scala User Group - first meetup</title>
      <link>https://blog.michal.pawlik.dev/posts/wsug-001/</link>
      <pubDate>Tue, 13 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/wsug-001/</guid>
      <description>&lt;p&gt;In this post I want to share a short recap of first Wrocław Scala User Group (WSUG) meetup. This will be kind of TIL entry, it doesn&amp;rsquo;t aim to cover the full presentation content. You can find the full agenda at the &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclaw-scala-user-group/events/290081999/&#34;&gt;event page&lt;/a&gt;. If you&amp;rsquo;d like to join the next meeting, join us at &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclaw-scala-user-group/&#34;&gt;Wroclaw Scala User Group at meetup.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This is my second post in &lt;a href=&#34;https://100daystooffload.com/&#34;&gt;#100DaysToOffload&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;first-talk---scala-cli---whats-the-new-scala-runner-capable-of-by-łuksz-wroński-lwronskihttpsgithubcomlwronski&#34;&gt;First talk - Scala CLI - what&amp;rsquo;s the new Scala runner capable of? by Łuksz Wroński &lt;a href=&#34;https://github.com/lwronski&#34;&gt;lwronski&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This talk was strictly focused on &lt;a href=&#34;https://scala-cli.virtuslab.org/&#34;&gt;scala-cli&lt;/a&gt;, a great command line utility for working with Scala. I&amp;rsquo;ve already introduced it in some of my articles (e.g. &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/refined/&#34;&gt;refined&lt;/a&gt;). If you&amp;rsquo;re not familiar with the tool, I strongly recommend visiting the &lt;a href=&#34;https://scala-cli.virtuslab.org/docs/getting_started&#34;&gt;getting started&lt;/a&gt; page, the documentation is really good and there&amp;rsquo;s no point rewriting it here.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
