<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Szymon Hałucha</title>
    <description>The latest articles on Forem by Szymon Hałucha (@szymonhalucha).</description>
    <link>https://forem.com/szymonhalucha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1234762%2F1a43b529-fd43-407e-896c-0c7c4d4042b6.png</url>
      <title>Forem: Szymon Hałucha</title>
      <link>https://forem.com/szymonhalucha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/szymonhalucha"/>
    <language>en</language>
    <item>
      <title>Fast string case transformation for the C#</title>
      <dc:creator>Szymon Hałucha</dc:creator>
      <pubDate>Thu, 23 May 2024 06:25:43 +0000</pubDate>
      <link>https://forem.com/szymonhalucha/fast-string-case-transformation-for-the-c-3b4e</link>
      <guid>https://forem.com/szymonhalucha/fast-string-case-transformation-for-the-c-3b4e</guid>
      <description>&lt;p&gt;Recently, I needed for my source generator a simple package that converts names from PascalCase to camelCase and vice versa. The available packages were not very optimal in terms of allocated memory, so I wrote my own, here are examples of usage along with a performance comparison.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/SzymonHalucha/Minerals.StringCases"&gt;https://github.com/SzymonHalucha/Minerals.StringCases&lt;/a&gt;&lt;br&gt;
NugGet: &lt;a href="https://www.nuget.org/packages/Minerals.StringCases/"&gt;https://www.nuget.org/packages/Minerals.StringCases/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Minerals.StringCases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"  _ example Variable - - Name   321"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;pascalCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToPascalCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// ExampleVariableName321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;camelCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToCamelCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// exampleVariableName321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;underscoreCamelCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToUnderscoreCamelCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// _exampleVariableName321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;kebabCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToKebabCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// example-variable-name-321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;snakeCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToSnakeCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// example_variable_name_321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;macroCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToMacroCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// EXAMPLE_VARIABLE_NAME_321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;trainCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToTrainCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Example-Variable-Name-321&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;titleCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToTitleCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Example Variable Name 321&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a comparison of the speed and amount of memory allocation with the most popular NuGet package similar to &lt;a href="https://www.nuget.org/packages/Minerals.StringCases/"&gt;Minerals.StringCases&lt;/a&gt; version 0.1.0 - &lt;a href="https://www.nuget.org/packages/CaseExtensions/"&gt;CaseExtesions&lt;/a&gt; version 1.1.0.&lt;/p&gt;

&lt;p&gt;String used to perform the comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"  _ example Variable - - Name   321"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BenchmarkDotNet v0.13.12, Windows 10 (10.0.19045.4291/22H2/2022Update)
AMD Ryzen 5 2600, 1 CPU, 12 logical and 6 physical cores
.NET SDK 8.0.204
  [Host]     : .NET 8.0.4 (8.0.424.16909), X64 RyuJIT AVX2
  Job-LXTTHC : .NET 8.0.4 (8.0.424.16909), X64 RyuJIT AVX2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Gen0&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CamelCase_Minerals_StringCases&lt;/td&gt;
&lt;td&gt;153.0 ns&lt;/td&gt;
&lt;td&gt;1.32 ns&lt;/td&gt;
&lt;td&gt;1.03 ns&lt;/td&gt;
&lt;td&gt;0.0343&lt;/td&gt;
&lt;td&gt;144 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PascalCase_Minerals_StringCases&lt;/td&gt;
&lt;td&gt;159.2 ns&lt;/td&gt;
&lt;td&gt;2.11 ns&lt;/td&gt;
&lt;td&gt;1.98 ns&lt;/td&gt;
&lt;td&gt;0.0343&lt;/td&gt;
&lt;td&gt;144 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SnakeCase_Minerals_StringCases&lt;/td&gt;
&lt;td&gt;187.9 ns&lt;/td&gt;
&lt;td&gt;1.12 ns&lt;/td&gt;
&lt;td&gt;1.00 ns&lt;/td&gt;
&lt;td&gt;0.0362&lt;/td&gt;
&lt;td&gt;152 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KebabCase_Minerals_StringCases&lt;/td&gt;
&lt;td&gt;202.1 ns&lt;/td&gt;
&lt;td&gt;1.94 ns&lt;/td&gt;
&lt;td&gt;1.82 ns&lt;/td&gt;
&lt;td&gt;0.0362&lt;/td&gt;
&lt;td&gt;152 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TrainCase_Minerals_StringCases&lt;/td&gt;
&lt;td&gt;213.2 ns&lt;/td&gt;
&lt;td&gt;1.22 ns&lt;/td&gt;
&lt;td&gt;1.08 ns&lt;/td&gt;
&lt;td&gt;0.0362&lt;/td&gt;
&lt;td&gt;152 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PascalCase_CaseExtensions&lt;/td&gt;
&lt;td&gt;517.7 ns&lt;/td&gt;
&lt;td&gt;4.23 ns&lt;/td&gt;
&lt;td&gt;3.96 ns&lt;/td&gt;
&lt;td&gt;0.0973&lt;/td&gt;
&lt;td&gt;408 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KebabCase_CaseExtensions&lt;/td&gt;
&lt;td&gt;529.3 ns&lt;/td&gt;
&lt;td&gt;3.52 ns&lt;/td&gt;
&lt;td&gt;3.29 ns&lt;/td&gt;
&lt;td&gt;0.0992&lt;/td&gt;
&lt;td&gt;416 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SnakeCase_CaseExtensions&lt;/td&gt;
&lt;td&gt;531.2 ns&lt;/td&gt;
&lt;td&gt;4.56 ns&lt;/td&gt;
&lt;td&gt;4.26 ns&lt;/td&gt;
&lt;td&gt;0.0992&lt;/td&gt;
&lt;td&gt;416 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TrainCase_CaseExtensions&lt;/td&gt;
&lt;td&gt;533.5 ns&lt;/td&gt;
&lt;td&gt;5.08 ns&lt;/td&gt;
&lt;td&gt;4.50 ns&lt;/td&gt;
&lt;td&gt;0.0992&lt;/td&gt;
&lt;td&gt;416 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CamelCase_CaseExtensions&lt;/td&gt;
&lt;td&gt;549.7 ns&lt;/td&gt;
&lt;td&gt;6.09 ns&lt;/td&gt;
&lt;td&gt;5.69 ns&lt;/td&gt;
&lt;td&gt;0.0973&lt;/td&gt;
&lt;td&gt;408 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Default Interface Implementation or Mix-in design pattern in the C#</title>
      <dc:creator>Szymon Hałucha</dc:creator>
      <pubDate>Sat, 04 May 2024 05:52:41 +0000</pubDate>
      <link>https://forem.com/szymonhalucha/default-interface-implementation-or-mix-in-design-pattern-in-the-c-12hi</link>
      <guid>https://forem.com/szymonhalucha/default-interface-implementation-or-mix-in-design-pattern-in-the-c-12hi</guid>
      <description>&lt;p&gt;In a recent project I wrote, I needed to implement the &lt;a href="https://en.wikipedia.org/wiki/Trait_(computer_programming)"&gt;traits&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Mixin"&gt;mix-in&lt;/a&gt; design pattern. The C# language has a built-in implementation of the traits pattern hiding under the name &lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods"&gt;Default Interface Implementation&lt;/a&gt;, but it is in the experimental stage and is not compatible with the &lt;code&gt;netstandard2.0&lt;/code&gt; standard. For the purpose of this project, I created a simple package implementing the mix-in pattern, which is compatible with &lt;code&gt;netstandard2.0&lt;/code&gt; and &lt;code&gt;C# 7.3+&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Minerals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoMixins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddMixin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExampleMixin1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExampleMixin2&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementation here...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Minerals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoMixins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenerateMixin&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleMixin1&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementation here...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Minerals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoMixins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenerateMixin&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleMixin2&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementation here...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/SzymonHalucha/Minerals.AutoMixins"&gt;https://github.com/SzymonHalucha/Minerals.AutoMixins&lt;/a&gt;&lt;br&gt;
NugGet: &lt;a href="https://www.nuget.org/packages/Minerals.AutoMixins/"&gt;https://www.nuget.org/packages/Minerals.AutoMixins/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Automatic interfaces generation in the C#</title>
      <dc:creator>Szymon Hałucha</dc:creator>
      <pubDate>Fri, 03 May 2024 04:38:23 +0000</pubDate>
      <link>https://forem.com/szymonhalucha/automatic-interfaces-generation-in-the-c-469k</link>
      <guid>https://forem.com/szymonhalucha/automatic-interfaces-generation-in-the-c-469k</guid>
      <description>&lt;p&gt;I created a simple package for the C# language to automatically generate an interfaces using incremental generators. Here's how to use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Minerals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoInterfaces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenerateInterface&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your implementation...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// or&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Minerals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoInterfaces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GenerateInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CustomInterfaceName"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your implementation...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/SzymonHalucha/Minerals.AutoInterfaces"&gt;https://github.com/SzymonHalucha/Minerals.AutoInterfaces&lt;/a&gt;&lt;br&gt;
NuGet: &lt;a href="https://www.nuget.org/packages/Minerals.AutoInterfaces/"&gt;https://www.nuget.org/packages/Minerals.AutoInterfaces/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
