<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xml" href="https://kafran.net/feed.xslt.xml"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://kafran.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://kafran.net/" rel="alternate" type="text/html" /><updated>2026-02-07T17:19:36-03:00</updated><id>https://kafran.net/feed.xml</id><title type="html">kafran.net</title><subtitle>Go &amp; Swift &amp; Python
</subtitle><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><entry><title type="html">Ditching VS Code for Zed Completely</title><link href="https://kafran.net/vscode-to-zed/" rel="alternate" type="text/html" title="Ditching VS Code for Zed Completely" /><published>2026-02-05T17:08:00-03:00</published><updated>2026-02-05T17:08:00-03:00</updated><id>https://kafran.net/vscode-to-zed</id><content type="html" xml:base="https://kafran.net/vscode-to-zed/"><![CDATA[<p>I got tired of opening VS Code and 2GB+ of RAM just fading away. VS Code was the major culprit behind my system’s frequent swapping. Zed has finally matured to the point where it can completely replace VS Code.</p>

<h2 id="parity-and-settings">Parity and Settings</h2>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="editor" /><category term="zed" /><category term="vs code" /><summary type="html"><![CDATA[The time to completely replace VS Code with Zed has finally arrived.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kafran.net/assets/images/drawings/the-software-smith/the-software-smith.jpeg" /><media:content medium="image" url="https://kafran.net/assets/images/drawings/the-software-smith/the-software-smith.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Github repo cleanup</title><link href="https://kafran.net/github-cleanup-repo/" rel="alternate" type="text/html" title="Github repo cleanup" /><published>2026-02-01T21:56:00-03:00</published><updated>2026-02-01T21:56:00-03:00</updated><id>https://kafran.net/github-cleanup-repo</id><content type="html" xml:base="https://kafran.net/github-cleanup-repo/"><![CDATA[<p>Github’s web interface does not offer an option to bulk delete deployments and action runs. But it’s possible to do so through the CLI tool.</p>

<h2 id="clean-up-deployments">Clean up deployments</h2>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">user</span><span class="o">=</span>&lt;user&gt; <span class="nv">repo</span><span class="o">=</span>&lt;repo&gt;<span class="p">;</span> gh api repos/<span class="nv">$user</span>/<span class="nv">$repo</span>/deployments <span class="nt">--paginate</span> <span class="nt">-q</span> <span class="s1">'.[].id'</span> | xargs <span class="nt">-n1</span> <span class="nt">-I</span> % gh api <span class="nt">--silent</span> repos/<span class="nv">$user</span>/<span class="nv">$repo</span>/deployments/% <span class="nt">-X</span> DELETE
</code></pre></div></div>

<h2 id="clean-up-action-runs">Clean up action runs</h2>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">user</span><span class="o">=</span> <span class="nv">repo</span><span class="o">=</span><span class="p">;</span> gh api repos/<span class="nv">$user</span>/<span class="nv">$repo</span>/actions/runs <span class="nt">--paginate</span> <span class="nt">-q</span> <span class="s1">'.workflow_runs[] | select(.head_branch != "master") | "\(.id)"'</span> | xargs <span class="nt">-n1</span> <span class="nt">-I</span> % gh api <span class="nt">--silent</span> repos/<span class="nv">$user</span>/<span class="nv">$repo</span>/actions/runs/% <span class="nt">-X</span> DELETE
</code></pre></div></div>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="github" /><category term="git" /><summary type="html"><![CDATA[Cleaning github repos using github's API.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kafran.net/assets/images/drawings/the-software-smith/the-software-smith.jpeg" /><media:content medium="image" url="https://kafran.net/assets/images/drawings/the-software-smith/the-software-smith.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Go: The Functional Option Pattern</title><link href="https://kafran.net/functional-option-pattern/" rel="alternate" type="text/html" title="Go: The Functional Option Pattern" /><published>2023-07-29T00:00:00-03:00</published><updated>2023-07-29T19:33:39-03:00</updated><id>https://kafran.net/functional-option-pattern</id><content type="html" xml:base="https://kafran.net/functional-option-pattern/"><![CDATA[<p>The Functional Options pattern is a design pattern in Go where you pass in functions that alter the state of a type. These functions are often called “option functions”. They provide a way to cleanly design APIs and offer a more flexible and readable way to interact with a function or type.</p>

<p>In the example bellow, we create a new server with host “localhost” and port “8080” by calling NewServer with <code class="language-plaintext highlighter-rouge">WithHost</code> and <code class="language-plaintext highlighter-rouge">WithPort</code> functions, which are examples of functional options.</p>

<p>This pattern allows for more readable and flexible configuration of objects. With this pattern, it’s easy to provide default values, and the API remains clean and easy to use even as more configuration options are added. Also, it’s clear which options have been set, and which have not.</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">Server</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">host</span> <span class="kt">string</span>
    <span class="n">port</span> <span class="kt">int</span>
<span class="p">}</span>

<span class="k">type</span> <span class="n">ServerOptions</span> <span class="k">func</span><span class="p">(</span><span class="o">*</span><span class="n">Server</span><span class="p">)</span>

<span class="k">func</span> <span class="n">WithHost</span><span class="p">(</span><span class="n">host</span> <span class="kt">string</span><span class="p">)</span> <span class="n">ServerOptions</span> <span class="p">{</span>
    <span class="k">return</span> <span class="k">func</span><span class="p">(</span><span class="n">s</span> <span class="o">*</span><span class="n">Server</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">s</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">WithPort</span><span class="p">(</span><span class="n">port</span> <span class="kt">int</span><span class="p">)</span> <span class="n">ServerOptions</span> <span class="p">{</span>
    <span class="k">return</span> <span class="k">func</span><span class="p">(</span><span class="n">s</span> <span class="o">*</span><span class="n">Server</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">s</span><span class="o">.</span><span class="n">port</span> <span class="o">=</span> <span class="n">port</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">NewServer</span><span class="p">(</span><span class="n">opts</span> <span class="o">...</span><span class="n">ServerOptions</span><span class="p">)</span> <span class="o">*</span><span class="n">Server</span> <span class="p">{</span>
    <span class="n">s</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">Server</span><span class="p">{}</span>
    <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">opt</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">opts</span> <span class="p">{</span>
        <span class="n">opt</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">s</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">s</span> <span class="o">:=</span> <span class="n">NewServer</span><span class="p">(</span><span class="n">WithHost</span><span class="p">(</span><span class="s">"localhost"</span><span class="p">),</span> <span class="n">WithPort</span><span class="p">(</span><span class="m">8080</span><span class="p">))</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This pattern is notably utilized in Go’s gRPC package, among others. The gRPC package provides numerous predefined functions for common options.</p>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="go" /><summary type="html"><![CDATA[A design pattern in Go to pass in functions that alter the state of a type.]]></summary></entry><entry><title type="html">Three languages, one algorithm</title><link href="https://kafran.net/three-languages-same-algorithm/" rel="alternate" type="text/html" title="Three languages, one algorithm" /><published>2023-03-16T00:00:00-03:00</published><updated>2023-03-16T11:11:00-03:00</updated><id>https://kafran.net/three-languages-same-algorithm</id><content type="html" xml:base="https://kafran.net/three-languages-same-algorithm/"><![CDATA[<p>The three languages I have been using the most are Python, Swift, and Go. Today I was trying to implement an easy LeetCode problem in these three languages for fun.</p>

<p>The problem is the famous <strong>Two Sum</strong>: “Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target”.</p>

<p>It’s incredible how fast Go is. It’s also amazing how fast Python got in the last few years, LeetCode uses Python 3.10. Despite being the language I enjoy the most, I was slightly disappointed by Swift.</p>

<h2 id="python">Python</h2>

<ul>
  <li>Runtime: 44ms</li>
  <li>Memory: 15.1 MB</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">twoSum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nums</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">target</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
        <span class="s">"""
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """</span>
        <span class="n">map_</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">nums</span><span class="p">):</span>
            <span class="n">comp</span> <span class="o">=</span> <span class="n">target</span> <span class="o">-</span> <span class="n">v</span>
            <span class="k">if</span> <span class="n">comp</span> <span class="ow">in</span> <span class="n">map_</span><span class="p">:</span>
                <span class="k">return</span> <span class="p">[</span><span class="n">map_</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">comp</span><span class="p">),</span> <span class="n">i</span><span class="p">]</span>
            <span class="n">map_</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>        
</code></pre></div></div>

<h2 id="swift">Swift</h2>

<ul>
  <li>Runtime: 45ms</li>
  <li>Memory: 14.5 MB</li>
</ul>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="kt">Solution</span> <span class="p">{</span>
    <span class="kd">func</span> <span class="nf">twoSum</span><span class="p">(</span><span class="n">_</span> <span class="nv">nums</span><span class="p">:</span> <span class="p">[</span><span class="kt">Int</span><span class="p">],</span> <span class="n">_</span> <span class="nv">target</span><span class="p">:</span> <span class="kt">Int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="p">{</span>
        <span class="k">var</span> <span class="nv">map</span><span class="p">:</span> <span class="p">[</span><span class="kt">Int</span><span class="p">:</span><span class="kt">Int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[:]</span>
        <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">in</span> <span class="n">nums</span><span class="o">.</span><span class="nf">enumerated</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">let</span> <span class="nv">compl</span> <span class="o">=</span> <span class="n">target</span> <span class="o">-</span> <span class="n">v</span>
            <span class="k">if</span> <span class="k">let</span> <span class="nv">compl</span> <span class="o">=</span> <span class="n">map</span><span class="p">[</span><span class="n">compl</span><span class="p">]</span> <span class="p">{</span>
                <span class="k">return</span> <span class="p">[</span><span class="n">compl</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span>
            <span class="p">}</span>
            <span class="n">map</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="p">[]</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="go">Go</h2>

<ul>
  <li>Runtime: 9ms</li>
  <li>Memory: 4.4 MB</li>
</ul>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">twoSum</span><span class="p">(</span><span class="n">nums</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="n">target</span> <span class="kt">int</span><span class="p">)</span> <span class="p">[]</span><span class="kt">int</span> <span class="p">{</span>
   <span class="n">m</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span>
   <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">nums</span> <span class="p">{</span>
       <span class="n">c</span> <span class="o">:=</span> <span class="n">target</span> <span class="o">-</span> <span class="n">v</span>
       <span class="k">if</span> <span class="n">c</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">m</span><span class="p">[</span><span class="n">c</span><span class="p">];</span> <span class="n">ok</span> <span class="p">{</span>
           <span class="k">return</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="n">c</span><span class="p">,</span> <span class="n">i</span><span class="p">}</span>
       <span class="p">}</span>
       <span class="n">m</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
   <span class="p">}</span>
   <span class="k">return</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="python" /><category term="swift" /><category term="go" /><summary type="html"><![CDATA[Implementing the same algorithm in Python, Swift and Go.]]></summary></entry><entry><title type="html">Swift’s OptionSet: an awesome bitwise operation use-case</title><link href="https://kafran.net/swift-optionset/" rel="alternate" type="text/html" title="Swift’s OptionSet: an awesome bitwise operation use-case" /><published>2022-11-16T13:00:00-03:00</published><updated>2022-11-16T13:00:00-03:00</updated><id>https://kafran.net/swift-optionset</id><content type="html" xml:base="https://kafran.net/swift-optionset/"><![CDATA[<p>Coming from a non-technical background with no Computer Science degree, I’ve had the pleasure of diving into the fascinating world of how computers work through self-learning resources. This curious journey introduced me to <a href="https://www.edx.org/course/introduction-computer-science-harvardx-cs50x">the realm of bits, bytes, and binary systems</a>, alongside an array of complex topics.</p>

<p>However, one concept that eluded my interest for quite some time was <a href="https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html">bitwise operators</a>. The generally intimidating tone of resources and books, often suggesting their use only for “complex stuff”, kept me at bay. I could never understand the real utility of using bitwise operators as I never had to do bit twiddling myself for the kind of problems I have been solving so far.</p>

<h2 id="why-use-bitwise-operators">Why use bitwise operators?</h2>

<p>As the name suggests, bitwise operators works on the individual bits.</p>

<blockquote>
  <p>Bitwise operators enable you to manipulate the individual raw data bits within a data structure. They’re often used in low-level programming, such as graphics programming and device driver creation. Bitwise operators can also be useful when you work with raw data from external sources, such as encoding and decoding data for communication over a custom protocol.</p>
</blockquote>

<p class="small"><cite>The Swift Programming Language Book</cite></p>

<p>I won’t go into the details of how these operators work as <a href="https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html#ID29">The Swift Programming Language Book</a> do a much better job. Instead, I’ll strive to stay focused on a thought-provoking use case, setting the stage for our main discussion: Swift’s OptionSet.</p>

<p>Imagine you want to store a boolean value. How much memory would it take? The smallest amount of space a variable can take is 1 byte. The reason for this is that it is the smallest unit of addressable space that a CPU can reference. Even a boolean, which only needs to represent true or false – theoretically just 1 bit – still consumes an entire byte, with the remaining 7 bits merely filling space. This can be a glaring inefficiency when we’re aiming for memory conservation.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">bool</span> <span class="o">=</span> <span class="kc">true</span>  <span class="c1">// 0b0000_0001</span>
<span class="k">var</span> <span class="nv">bool</span> <span class="o">=</span> <span class="kc">false</span> <span class="c1">// 0b0000_0000</span>
</code></pre></div></div>

<p>In most applications, there are numerous flags at play. Consider Unix file permissions for instance. A user might be granted permission to read, write, execute, or even all of these simultaneously. When you execute <code class="language-plaintext highlighter-rouge">chmod 777 file</code> in your terminal, this is essentially what you’re doing - toggling flags on and off.</p>

<p>To make the most out of the available space programmers would combine multiple flags into a single byte allowing them to store up to 8 different boolean values. So, in one byte you can store up to 8 boolean values.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">x</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0001</span> <span class="c1">// execute - in base 10 this 1</span>
<span class="k">let</span> <span class="nv">w</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0010</span> <span class="c1">// write - in base 10 this is 2</span>
<span class="k">let</span> <span class="nv">r</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0100</span> <span class="c1">// read - in base 10 this is 4</span>

<span class="k">let</span> <span class="nv">rwx</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0111</span> <span class="c1">// read, write, execute - in base 10 this is 7</span>
</code></pre></div></div>

<p>That’s why the flag to set permission to read, write and execute is 7. Because the binary integer <code class="language-plaintext highlighter-rouge">0b0000_0111</code> is the decimal integer <code class="language-plaintext highlighter-rouge">7</code>. However, to manipulate these individual bits (to turn them on and off), we need some way to identify the specific bits we want to manipulate. Unfortunately, the bitwise operators don’t know how to work with bit positions. Instead, they work with bit masks.</p>

<h3 id="bit-masks">Bit masks</h3>

<p>A bit mask is a predefined set of bits that are used to select which specific bits will be modified by subsequent operations. In the example above we set 3 masks, one for read, one for write, and another for execute. So, continuing with the example, suppose we want to set the permission to read and write:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Masks</span>
<span class="k">let</span> <span class="nv">x</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0001</span> <span class="c1">// execute</span>
<span class="k">let</span> <span class="nv">w</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0010</span> <span class="c1">// write</span>
<span class="k">let</span> <span class="nv">r</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="mb">0b0000_0100</span> <span class="c1">// read</span>

<span class="c1">// To set (turn on) a bit we use the bitwise operator OR (|)</span>
<span class="k">let</span> <span class="nv">rw</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="n">r</span> <span class="o">|</span> <span class="n">w</span> <span class="c1">// 0b0000_0110 - in base 10 this is 6</span>
<span class="k">let</span> <span class="nv">rwx</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="o">=</span> <span class="n">r</span> <span class="o">|</span> <span class="n">w</span> <span class="o">|</span> <span class="n">x</span> <span class="c1">// 0b0000_0111 - in base 10 this is 7</span>
</code></pre></div></div>

<p>For more detail on all other operators and how these operators work read the excellent <a href="https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html#ID29">Swift Programming Language Book</a>.</p>

<p>Hold on a second, we began this discussion with a promise of memory efficiency. Yet the earlier example doesn’t really seem to save any memory. Normally, 3 booleans would consume 3 bytes. In contrast, the previous example demands 4 bytes (3 bytes to establish the bit masks, and 1 byte for the flag itself).</p>

<p>It’s essential to consider scale here. Bit flags truly shine when you’re handling numerous identical flag variables. In the previous example, we were focusing solely on one permission set: the user permissions (or owner permissions in Unix terminology). Now, imagine that you also want to set permissions for a group and other users. Or even more challenging, envision setting permissions for 100 users. Instead of one permission set (the owner), now you have 100. Using 3 Booleans per permission set (one for each potential state) would consume 300 bytes of memory. Employing bit flags, you’d need just 3 bytes for the bit masks, and 100 bytes for the bit flag variables, amounting to 103 bytes of memory in total – roughly a third of the memory usage.</p>

<p>Ok but this is all about Swift and iOS development, why bother to save a few bytes of memory, right? Probably your use case won’t scale to tens of thousands or even millions of similar objects to be worth the added complexity.</p>

<p>That being said, there’s another scenario where bit flags and bit masks prove beneficial, and it’s well-utilized by UIKit and SwiftUI. Imagine a situation where you have a function capable of accepting any combination of eight or more different options – for the sake of simplicity, let’s stick with an 8-bit base. One approach to define such a function would be to use eight individual Boolean parameters:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">someFunc</span><span class="p">(</span>
    <span class="nv">option1</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option2</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option3</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option4</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option5</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option6</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option7</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
    <span class="nv">option8</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span>
<span class="p">)</span> <span class="p">{}</span>
</code></pre></div></div>

<p>Crazy, right? Now imagine you want to call this function with options 2 and 7 set to <code class="language-plaintext highlighter-rouge">true</code>:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">someFunc</span><span class="p">(</span>
    <span class="nv">option1</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
    <span class="nv">option2</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
    <span class="nv">option3</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
    <span class="nv">option4</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
    <span class="nv">option5</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
    <span class="nv">option6</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
    <span class="nv">option7</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
    <span class="nv">option8</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Well, thanks to <a href="https://docs.swift.org/swift-book/LanguageGuide/Functions.html#ID166">Swift’s argument label</a> this doesn’t sacrifice readability but I hope you understand the mess.</p>

<h2 id="swifts-optionset">Swift’s OptionSet</h2>

<p>Swift’s OptionSet solves exactly this problem. Take for example the <code class="language-plaintext highlighter-rouge">.padding()</code> modifier on SwiftUI – used to add a specified amount of padding to one or more edges of the view. The <code class="language-plaintext highlighter-rouge">.padding()</code> modifier and many other SwiftUI and UIKit functions receive an OptionSet. When you apply a <code class="language-plaintext highlighter-rouge">.padding()</code> with <code class="language-plaintext highlighter-rouge">[.top, .bottom, .leading, .trailing]</code> you are not passing an Array of Enum cases, you are passing an OptionSet.</p>

<p>By definition, all option sets conform to the RawRepresentable protocol through inheritance, which allows for the raw value of an option set instance to store the instance’s bitfield. This raw value needs to conform to the FixedWidthInteger protocol, such as UInt8 or Int. In turn, the FixedWidthInteger protocol extends the capabilities of the BinaryInteger protocol by including binary bitwise operations, bit shifts, and overflow handling.</p>

<p>Continuing the example above, we could define an OptionSet:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">MyEightOptions</span><span class="p">:</span> <span class="kt">OptionSet</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">rawValue</span><span class="p">:</span> <span class="kt">UInt8</span> <span class="c1">// Stores our flags</span>

    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option1</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0000_0001</span><span class="p">)</span> <span class="c1">// 1</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option2</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0000_0010</span><span class="p">)</span> <span class="c1">// 2</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option3</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0000_0100</span><span class="p">)</span> <span class="c1">// 4</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option4</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0000_1000</span><span class="p">)</span> <span class="c1">// 8</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option5</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0001_0000</span><span class="p">)</span> <span class="c1">// 16</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option6</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0010_0000</span><span class="p">)</span> <span class="c1">// 32</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option7</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b0100_0000</span><span class="p">)</span> <span class="c1">// 64</span>
    <span class="kd">static</span> <span class="k">let</span> <span class="nv">option8</span> <span class="o">=</span> <span class="kt">MyEightOptions</span><span class="p">(</span><span class="nv">rawValue</span><span class="p">:</span> <span class="mb">0b1000_0000</span><span class="p">)</span> <span class="c1">// 128</span>

    <span class="kd">static</span> <span class="k">let</span> <span class="nv">all</span><span class="p">:</span> <span class="kt">MyEightOptions</span> <span class="o">=</span> <span class="p">[</span>
        <span class="o">.</span><span class="n">option1</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option2</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option3</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option4</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option5</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option6</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option7</span><span class="p">,</span>
        <span class="o">.</span><span class="n">option8</span><span class="p">,</span>
    <span class="p">]</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And then have it in our function instead of all those parameters:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">someFunc</span><span class="p">(</span><span class="nv">options</span><span class="p">:</span> <span class="kt">MyEightOptions</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="nf">contains</span><span class="p">([</span><span class="o">.</span><span class="n">option2</span><span class="p">,</span> <span class="o">.</span><span class="n">option7</span><span class="p">])</span> <span class="p">{</span>
        <span class="nf">print</span><span class="p">(</span><span class="s">"</span><span class="se">\(</span><span class="n">options</span><span class="se">)</span><span class="s">"</span><span class="p">)</span> 
    <span class="p">}</span>
<span class="p">}</span> 

<span class="nf">someFunc</span><span class="p">(</span><span class="nv">options</span><span class="p">:</span> <span class="p">[</span><span class="o">.</span><span class="n">option2</span><span class="p">,</span> <span class="o">.</span><span class="n">option7</span><span class="p">])</span> <span class="c1">// MyEightOptions(rawValue: 66)</span>
</code></pre></div></div>

<p>Much cleaner, right? Also, we have context now. In the example above MyEightOptions(rawValue: 66) stores de integer 66 wich is the binary integer <code class="language-plaintext highlighter-rouge">0b0100_0010</code>, indicating that option2 and option7 are flagged on.</p>

<p>I hope this article has helped you to understand these SwiftUI and UIKit constructs and how OptionSet works behind the scenes.</p>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="swift" /><summary type="html"><![CDATA[I have been avoiding that part of the book which talks about bitwise operators until I saw Swift's OptionSet on iOS frameworks.]]></summary></entry><entry><title type="html">SwiftUI: Understanding Core Data [Draft]</title><link href="https://kafran.net/understanding-core-data/" rel="alternate" type="text/html" title="SwiftUI: Understanding Core Data [Draft]" /><published>2022-10-22T15:40:00-03:00</published><updated>2022-10-22T15:40:00-03:00</updated><id>https://kafran.net/understanding-core-data</id><content type="html" xml:base="https://kafran.net/understanding-core-data/"><![CDATA[<p>When I started on mobile development I tried the three main flavors of it: Android Native, iOS Native and Flutter. Besides being an Apple costumer myself, the developer experience is one of <a href="https://kafran.codes/why-ios-development/">the reasons why I decided to dive into iOS Native development</a>. Apple delivers solutions to complex problems throughout it’s rich ecosystem of frameworks and APIs so developers can focus on what matters: solve people’s problems instead of computers’ problems.</p>

<p>Core Data is an object graph and persistence framework amongst the list of frameworks provided by Apple. It’s available on iOS since iPhone SDK 3.0. Yep, it’s really old and mature, which in software usually translates to “stability”. But equally, it’s starting to show its age when it comes to integrating the framework into new ones like SwiftUI.</p>

<p>Core Data has undoubtedly contributions to give to the <a href="https://developer.apple.com/forums/thread/699003">hot topic around SwiftUI and MVVM</a> since the introduction of a new property wrapper to integrate the framework into SwiftUI: <code class="language-plaintext highlighter-rouge">@FetchRequest</code>. Actually the framework has its caveats to integrate into Swift it self since the framework was built with Objective-C; Odptional has different meaning between the framework and the Swift language.</p>

<figure style="width: 148px; height: 320px;" class="align-right">
  <img src="https://kafran.net/assets/images/posts/2022-10-22-understanding-core-data/coredata.gif" alt="A Core Data sample app" />
  <figcaption>Core Data sample app.</figcaption>
</figure>

<p>When <a href="https://github.com/kafran/Understanding-Core-Data-with-SwiftUI">experimenting with Core Data and SwiftUI</a>, state management was one thing really mind-bending to me. Mixing an imperative framework with a declarative one feels really weird. Commits <a href="https://github.com/kafran/Understanding-Core-Data-with-SwiftUI/commit/195f451939d24f7a41cd986e79ce11082d91f36b">195f451</a> and <a href="https://github.com/kafran/Understanding-Core-Data-with-SwiftUI/commit/57e5aa1a2e63488cefff3de01333c1f430279378">57e5aa1</a> were me trying to deal with changes to Core Data’s NSManagedObject which conforms to ObservableObject not updating the view.</p>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="swiftui" /><category term="ios" /><category term="core data" /><summary type="html"><![CDATA[Core Data is an object graph and persistence framework available on iOS since iPhone SDK 3.0 and it's starting to show its age.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kafran.net/assets/images/posts/2022-10-22-understanding-core-data/caju.jpeg" /><media:content medium="image" url="https://kafran.net/assets/images/posts/2022-10-22-understanding-core-data/caju.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">SwiftUI: Creating a CardView</title><link href="https://kafran.net/swiftui-list-card-view/" rel="alternate" type="text/html" title="SwiftUI: Creating a CardView" /><published>2022-08-25T00:00:00-03:00</published><updated>2022-08-25T13:07:41-03:00</updated><id>https://kafran.net/swiftui-list-card-view</id><content type="html" xml:base="https://kafran.net/swiftui-list-card-view/"><![CDATA[<p>I love the way Apple’s Health and Fitness apps presents CardViews: in a List with a gap between the cards and a swipe left to delete. <a href="https://stackoverflow.com/a/73488666/3147247">This seem to be a desired design between iOS developers</a>.</p>

<figure style="width: 300px" class="align-center">
  <img src="https://kafran.net/assets/images/posts/2022-08-25-swiftui-list-card-view/cardview.jpeg" alt="Apple's Fitness app with a swift to delete List CardView" />
  <figcaption>Apple's Fitness App.</figcaption>
</figure>

<p><a href="https://github.com/kafran/swiftui-list-card-view-example">This playground is a simple example on how to recreate the same effect with SwiftUI</a> since all the examples I found online implements <a href="https://github.com/rick2785/Cart">the same design in a much more complex manner</a>.</p>

<figure style="width: 300px" class="align-center">
  <img src="https://kafran.net/assets/images/posts/2022-08-25-swiftui-list-card-view/iphoneframe.png" alt="List Card View with swipe to delete" />
  <figcaption>List Card View with swipe to delete.</figcaption>
</figure>

<p>We’ll take the Apple’s Dev Training “<a href="https://developer.apple.com/tutorials/app-dev-training/creating-a-card-view">Creating a card view</a>” as an inspiration and starting point.</p>

<h3 id="data-model">Data Model</h3>

<p>First lets create the Data Model for our CardView. It’s a simple model holding a Theme to color our CardViews.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">Foundation</span>

<span class="kd">struct</span> <span class="kt">ColorCard</span><span class="p">:</span> <span class="kt">Identifiable</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">id</span> <span class="o">=</span> <span class="kt">UUID</span><span class="p">()</span>
    <span class="k">var</span> <span class="nv">theme</span><span class="p">:</span> <span class="kt">Theme</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="card-view">Card View</h3>

<p>The CardView has the following structure.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">SwiftUI</span>

<span class="kd">struct</span> <span class="kt">CardView</span><span class="p">:</span> <span class="kt">View</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">colorCard</span><span class="p">:</span> <span class="kt">ColorCard</span>

    <span class="k">var</span> <span class="nv">body</span><span class="p">:</span> <span class="kd">some</span> <span class="kt">View</span> <span class="p">{</span>
        <span class="kt">Text</span><span class="p">(</span><span class="n">colorCard</span><span class="o">.</span><span class="n">theme</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
            <span class="o">.</span><span class="nf">foregroundColor</span><span class="p">(</span><span class="n">colorCard</span><span class="o">.</span><span class="n">theme</span><span class="o">.</span><span class="n">accentColor</span><span class="p">)</span>
            <span class="o">.</span><span class="nf">font</span><span class="p">(</span><span class="o">.</span><span class="n">headline</span><span class="p">)</span>
            <span class="o">.</span><span class="nf">padding</span><span class="p">(</span>
                <span class="kt">EdgeInsets</span><span class="p">(</span>
                    <span class="nv">top</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>
                    <span class="nv">leading</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
                    <span class="nv">bottom</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>
                    <span class="nv">trailing</span><span class="p">:</span> <span class="mi">5</span>
                <span class="p">)</span>
            <span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="content-view">Content View</h3>

<p>And finally our ContentView containing the List of CardViews. To create the gap between the List items we remove the list row separators <code class="language-plaintext highlighter-rouge">.listRowSeparator(.hidden)</code> and set the list row background to an InsettableShape <code class="language-plaintext highlighter-rouge">.listRowBackground()</code> defining a top and a bottom EdgeInsets padding. The final touch is to set the <code class="language-plaintext highlighter-rouge">.listStyle(.plain)</code> to <code class="language-plaintext highlighter-rouge">.plain</code>.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">SwiftUI</span>

<span class="kd">struct</span> <span class="kt">ContentView</span><span class="p">:</span> <span class="kt">View</span> <span class="p">{</span>
    <span class="kd">@State</span> <span class="kd">private</span> <span class="k">var</span> <span class="nv">colorCards</span><span class="p">:</span> <span class="p">[</span><span class="kt">ColorCard</span><span class="p">]</span> <span class="o">=</span> <span class="kt">ColorCard</span><span class="o">.</span><span class="n">sampleData</span>

    <span class="k">var</span> <span class="nv">body</span><span class="p">:</span> <span class="kd">some</span> <span class="kt">View</span> <span class="p">{</span>
        <span class="kt">List</span> <span class="p">{</span>
            <span class="kt">ForEach</span><span class="p">(</span><span class="n">colorCards</span><span class="p">)</span> <span class="p">{</span> <span class="n">colorCard</span> <span class="k">in</span>
                <span class="kt">NavigationLink</span><span class="p">(</span><span class="nv">destination</span><span class="p">:</span> <span class="n">colorCard</span><span class="o">.</span><span class="n">theme</span><span class="o">.</span><span class="n">mainColor</span><span class="p">)</span> <span class="p">{</span>
                    <span class="kt">CardView</span><span class="p">(</span><span class="nv">colorCard</span><span class="p">:</span> <span class="n">colorCard</span><span class="p">)</span>
                <span class="p">}</span>
                <span class="o">.</span><span class="nf">listRowSeparator</span><span class="p">(</span><span class="o">.</span><span class="n">hidden</span><span class="p">)</span>
                <span class="o">.</span><span class="nf">listRowBackground</span><span class="p">(</span>
                    <span class="kt">RoundedRectangle</span><span class="p">(</span><span class="nv">cornerRadius</span><span class="p">:</span> <span class="mi">5</span><span class="p">)</span>
                        <span class="o">.</span><span class="nf">background</span><span class="p">(</span><span class="o">.</span><span class="n">clear</span><span class="p">)</span>
                        <span class="o">.</span><span class="nf">foregroundColor</span><span class="p">(</span><span class="n">colorCard</span><span class="o">.</span><span class="n">theme</span><span class="o">.</span><span class="n">mainColor</span><span class="p">)</span>
                        <span class="o">.</span><span class="nf">padding</span><span class="p">(</span>
                            <span class="kt">EdgeInsets</span><span class="p">(</span>
                                <span class="nv">top</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
                                <span class="nv">leading</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
                                <span class="nv">bottom</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
                                <span class="nv">trailing</span><span class="p">:</span> <span class="mi">10</span>
                            <span class="p">)</span>
                        <span class="p">)</span>
                <span class="p">)</span>
            <span class="p">}</span>
            <span class="o">.</span><span class="n">onDelete</span> <span class="p">{</span> <span class="n">idx</span> <span class="k">in</span>
                <span class="n">colorCards</span><span class="o">.</span><span class="nf">remove</span><span class="p">(</span><span class="nv">atOffsets</span><span class="p">:</span> <span class="n">idx</span><span class="p">)</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="o">.</span><span class="nf">listStyle</span><span class="p">(</span><span class="o">.</span><span class="n">plain</span><span class="p">)</span>
        <span class="o">.</span><span class="nf">navigationTitle</span><span class="p">(</span><span class="s">"Color Cards"</span><span class="p">)</span>
        <span class="o">.</span><span class="n">toolbar</span> <span class="p">{</span>
            <span class="kt">Button</span> <span class="p">{</span>
                <span class="n">colorCards</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="kt">ColorCard</span><span class="p">(</span><span class="nv">theme</span><span class="p">:</span> <span class="kt">Theme</span><span class="o">.</span><span class="n">allCases</span><span class="o">.</span><span class="nf">randomElement</span><span class="p">()</span><span class="o">!</span><span class="p">))</span>
            <span class="p">}</span> <span class="nv">label</span><span class="p">:</span> <span class="p">{</span>
                <span class="kt">Image</span><span class="p">(</span><span class="nv">systemName</span><span class="p">:</span> <span class="s">"plus"</span><span class="p">)</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>A complete Playground App is available on github reposity <a href="https://github.com/kafran/swiftui-list-card-view-example">SwiftUI List CardView Example</a>.</p>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="swiftui" /><category term="ios" /><summary type="html"><![CDATA[I love the way Apple's Health and Fitness apps presents CardViews: in a List with a gap between the cards and a swipe left to delete. I will try to create the same with SwiftUI.]]></summary></entry><entry><title type="html">The Pythonic way to iterate over a list in chunks</title><link href="https://kafran.net/iterate-over-list-in-chunks/" rel="alternate" type="text/html" title="The Pythonic way to iterate over a list in chunks" /><published>2020-04-26T00:00:00-03:00</published><updated>2020-04-26T16:14:00-03:00</updated><id>https://kafran.net/iterate-over-list-in-chunks</id><content type="html" xml:base="https://kafran.net/iterate-over-list-in-chunks/"><![CDATA[<p>Today I was trying to parse some Fixed Width Text Files at work and I came across with the following problem: what’s the most beautiful pythonic way to iterate over a list in chunks?</p>

<p>Kidding, I don’t know if this is the best way but I am luck enough to be working with Python 3.8 and this seems to be a good opportunity to use the new Walrus <code class="language-plaintext highlighter-rouge">:=</code> operator.</p>

<p><a href="https://stackoverflow.com/a/61435714/3147247">This even seems to be a popular question on Stack Overflow</a>.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">islice</span>

<span class="n">list_</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">100</span><span class="p">)]</span>

<span class="k">def</span> <span class="nf">chunker</span><span class="p">(</span><span class="n">it</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
    <span class="n">iterator</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">it</span><span class="p">)</span>
    <span class="k">while</span> <span class="n">chunk</span> <span class="p">:</span><span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">iterator</span><span class="p">,</span> <span class="n">size</span><span class="p">)):</span>
        <span class="k">print</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">In</span> <span class="p">[</span><span class="mi">2</span><span class="p">]:</span> <span class="n">chunker</span><span class="p">(</span><span class="n">list_</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">19</span><span class="p">]</span>
<span class="p">[</span><span class="mi">20</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">29</span><span class="p">]</span>
<span class="p">[</span><span class="mi">30</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">38</span><span class="p">,</span> <span class="mi">39</span><span class="p">]</span>
<span class="p">[</span><span class="mi">40</span><span class="p">,</span> <span class="mi">41</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mi">43</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">47</span><span class="p">,</span> <span class="mi">48</span><span class="p">,</span> <span class="mi">49</span><span class="p">]</span>
<span class="p">[</span><span class="mi">50</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">53</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">57</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">59</span><span class="p">]</span>
<span class="p">[</span><span class="mi">60</span><span class="p">,</span> <span class="mi">61</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">63</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">66</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mi">69</span><span class="p">]</span>
<span class="p">[</span><span class="mi">70</span><span class="p">,</span> <span class="mi">71</span><span class="p">,</span> <span class="mi">72</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">74</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">76</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mi">79</span><span class="p">]</span>
<span class="p">[</span><span class="mi">80</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span> <span class="mi">82</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">84</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">87</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">89</span><span class="p">]</span>
<span class="p">[</span><span class="mi">90</span><span class="p">,</span> <span class="mi">91</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">93</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">95</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">99</span><span class="p">]</span>
</code></pre></div></div>]]></content><author><name>Kolmar Kafran</name><email>hello@kafran.net</email></author><category term="python" /><summary type="html"><![CDATA[Today I was trying to parse some Fixed Width Text Files at work and I came across with the following problem: what's the most beautiful pythonic way to iterate over a list in chunks?]]></summary></entry></feed>