<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:at="http://www.sixapart.com/ns/at"
    xmlns:icbm="http://postneo.com/icbm"
    xmlns:rvw="http://purl.org/NET/RVW/0.2/"
    xmlns:media="http://search.yahoo.com/mrss">
    <channel>
        <title>Miguel</title>
        <link>http://migmit.vox.com/library/posts/page/1/</link>
        <description></description>
        <language>en</language>
        <generator>Vox</generator>
        <lastBuildDate>Wed, 18 Nov 2009 18:17:01 +0300</lastBuildDate>
        <copyright>Copyright 2009</copyright>
        <docs>http://blogs.law.harvard.edu/tech/rss</docs>  
 
        <item>
            <title>Текущая работа</title>
            <link>http://migmit.vox.com/library/post/%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B0%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B0%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B0%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full</guid> 
            <pubDate>Wed, 18 Nov 2009 18:17:01 +0300</pubDate>         
            
            <description>    &lt;p&gt;Картинка из игры, которую мы сейчас делаем. Без комментариев.
    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398c5c26f00050123dde817ca860d&quot; at:format=&quot;extra-large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-extra-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://migmit.vox.com/library/photo/6a00e398c5c26f00050123dde817ca860d.html&quot;&gt;&lt;img src=&quot;http://a2.vox.com/6a00e398c5c26f00050123dde817ca860d-500pi&quot; alt=&quot;WTF1&quot; title=&quot;WTF1&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://migmit.vox.com/library/photo/6a00e398c5c26f00050123dde817ca860d.html&quot; title=&quot;WTF1&quot;&gt;WTF1&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;

 &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B0%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f00050123dde817ed860d?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>    
        </item> 
 
        <item>
            <title>Игрушечный веб 2.0</title>
            <link>http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1-20.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1-20.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1-20.html?_c=feed-rss-full</guid> 
            <pubDate>Mon, 16 Nov 2009 00:14:31 +0300</pubDate>         
            
            <description>    &lt;p&gt;Здравствуй, дорогой дневник. Что-то давно я в тебя ничего не писал.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;p&gt;Уважаемый &lt;a href=&quot;http://esil0x.livejournal.com/profile&quot;&gt;&lt;img alt=&quot;[info]&quot; class=&quot;ContextualPopup&quot; height=&quot;17&quot; src=&quot;http://l-stat.livejournal.com/img/userinfo.gif&quot; style=&quot;border: 0pt none ; vertical-align: bottom; padding-right: 1px;&quot; width=&quot;17&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://esil0x.livejournal.com/?style=mine&quot;&gt;&lt;strong&gt;esil0x&lt;/strong&gt;&lt;/a&gt; подбил меня переписать мой &amp;quot;игрушечный веб&amp;quot; таким образом, чтобы&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Хранить всё состояние виджетов на сервере&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Не требовать возможности сериализовать состояние&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Сделать более гибкие виджеты - например, упоминавшийся мной &amp;quot;хамелеон&amp;quot;, которые может вести себя как любой виджет, который нам будет угодно ему скормить в рантайме&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Я, естественно, повёлся на это &amp;quot;слабо&amp;quot; и около недели писал всё это дело, прерываясь на текущую работу, ужин и убийство зомби. Представляю интересующимся результаты.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Для начала: полностью отказаться от сериализации, естественно, невозможно - да и не нужно. Всё-таки конечный продукт нашей деятельности - веб-страница, которая как сама должна передаваться по сети, так и действия пользователя должны передаваться обратно. Их-то (в смысле, действия пользователя) мы и будем сериализовать.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Как и раньше, мы будем считать, что каждый виджет имеет некий &amp;quot;входной&amp;quot; канал, по которому ему подаются команды, и &amp;quot;выходной&amp;quot; канал, в который он выдаёт результаты. Мы собираем виджеты воедино, используя некие комбинаторы - в основном, стрелочные. Кроме этого, мы будем считать, что каждый виджет имеет некий &amp;quot;выхлоп&amp;quot;, который показывает, что именно сделал пользователь. Наконец, разумным кажется предположение, что результат, выдаваемый виджетом, полностью определяется его входом и его &amp;quot;выхлопом&amp;quot;. В принципе, это не всегда так - например, возможен виджет, выход которого зависит от того, сколько времени прошло с момента загрузки страницы, или вообще случаен. Мы, однако, строим упрощённую модель и такие тонкости игнорируем.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Теперь далее: что вообще может сделать пользователь? В нашей модели он, фактически, может сделать только одно: щёлкнуть по какой-то ссылке. Если расширять модель - скажем, добавить в неё заполняемые пользователем формы - то добавится ещё вариант, например, &amp;quot;отправить форму с такими-то данными&amp;quot; (да-да, в этом игрушечном вебе нет форм). В любом случае, если на странице расположены несколько виджетов, пользователь может что-то сделать лишь с одним из них; &amp;quot;выхлоп&amp;quot; остальных должен показывать, что никаких действий не произведено.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Я думал вначале сделать &amp;quot;выхлоп&amp;quot; значением типа &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Maybe&lt;/span&gt; a&lt;/code&gt;, с тем, чтобы значение &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt;&lt;/code&gt; означало, что пользователь с этим виджетом ничего не делал. Однако, некоторые виджеты не содержат никаких ссылок, причём при комбинаторном подходе, когда сложные виджеты собираются из простых, виджетов без ссылок будет очень много. Можно бы, конечно, включить прагму &lt;code&gt;&lt;span style=&quot;color: #b12121&quot;&gt;EmptyDataDecls&lt;/span&gt;&lt;/code&gt; и использовать пустой тип для обозначения действий пользователя с таким виджетом, но при сериализации в результате получается куча лишнего текста. Я решил использовать более хитрый приём. Вместо &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Maybe&lt;/span&gt; a&lt;/code&gt; мы используем &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Either&lt;/span&gt; a &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt; - это ведь то же самое. Для виджетов, не подразумевающих взаимодействие с пользователем, мы используем тип, изоморфный &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt;. В любом случае, получается, что &amp;quot;выхлоп&amp;quot; виджета получается применением некоторого функтора к типу &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt;. Далее, &amp;quot;выхлоп&amp;quot; пары виджетов получается как применение к тому же типу &lt;strong&gt;композиции&lt;/strong&gt; соответствующих функторов. Всё это выражается в следующем модуле:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt;, unit, &lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt;, &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt;, &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt;, writeSer, readSer, embedSer, mergeSer, fstSer, sndSer) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Monad.State&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Не всякий функтор, разумеется подойдёт. Мы заводим специальный класс:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Нам понадобятся функции сериализации и десериализации. При этом мы будем предполагать, что сериализовать (соответственно, десериализовать) то, что находится внутри функтора, мы уже умеем.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serialize &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; (a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;State&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;State&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; deserialize &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;State&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;State&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; (f a)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Кроме того, нам нужны будут функции, позволяющие из двух функторов составить один, и, соответственно, разобрать обратно - для того, чтобы делать составной виджет из двух в него входящих. Для этого предназначены следующие два метода - как именно они используются, будет ясно потом.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unit &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; f &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transform &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; f a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Немного поясню. Предполагается, что метод &lt;code&gt;transform&lt;code&gt; должен просто извлекать значение из-под функтора; если же значение извлечь нельзя - используется значение по умолчанию, переданное вторым аргументом.&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Сразу заведём функции сериализации и десериализации для случая, когда в нашем функторе зашит тип &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt; - именно эти функции мы будем экспортировать.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;writeSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; f &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;writeSer&lt;/span&gt; fu &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; execState (serialize (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; return &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;) fu) &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;readSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;readSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; evalState &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; deserialize &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; return &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пригодится также функция, позволяющая засунуть внутрь функтора любое значение:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;embedSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f a&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;embedSer&lt;/span&gt; x &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; fmap (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; x) unit&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Далее, начнём заводить инстансы. Для начала - тот самый функтор, который даёт тип, изоморфный содержащемуся внутри; напоминаю, он будет использоваться для виджетов, с которыми пользователь взаимодействовать не может.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;newtype&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; {fromId &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; a}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;makeId&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; a&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;makeId&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Функцию &lt;code&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;makeId&lt;/span&gt;&lt;/code&gt; я завёл только по давно сформировавшейся привычке не экспортировать из модуля конструкторы - иначе изменишь тип данных на более общий, после чего рыскаешь по всем файлам проекта, ища, где ещё сломается.&lt;br /&gt;Как я и сказал, этот тип будет инстансом нашего класса:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; fmap h (&lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; a) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; (h a)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serialize ser (&lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; a) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; ser a&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; deserialize &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; liftM &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unit &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transform (&lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; x) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; const x&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Далее, обещаный тип &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Either&lt;/span&gt;&lt;/code&gt;. Я хочу иметь некоторый контроль над тем, что именно может быть &amp;quot;выхлопом&amp;quot;, поэтому завожу вспомогательный класс без методов&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;class&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Read&lt;/span&gt; t, &lt;span style=&quot;color: #218a21&quot;&gt;Show&lt;/span&gt; t) &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt; t&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;и единственный инстанс, который мне здесь понадобится.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если бы у меня были формы, я завёл бы инстансов побольше; сейчас же, когда все действия пользователя исчерпываются кликами (одной кнопкой) хватит и этого.&lt;br /&gt;&lt;p&gt;Обещанный инстанс:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt; t &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Either&lt;/span&gt; t) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serialize &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; t) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; modify (&lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;L&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; show t &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;|&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serialize ser (&lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; x) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; modify (&lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;R&amp;quot;&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ser x&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; deserialize des &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; c &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; gets head&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; modify tail&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;case&lt;/span&gt; c &lt;span style=&quot;color: #7f007f&quot;&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;#39;L&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; value &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; gets &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; takeWhile (&lt;span style=&quot;color: #b8850a&quot;&gt;/=&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;#39;|&amp;#39;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; modify &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; tail &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; dropWhile (&lt;span style=&quot;color: #b8850a&quot;&gt;/=&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;#39;|&amp;#39;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; read value&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;#39;R&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; liftM &lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; des&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unit &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transform (&lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transform (&lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; x) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; const x&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Здесь, мне кажется, всё должно быть понятно. Если у нас левое значение - пишем букву &amp;quot;L&amp;quot; и само значение, добавляя в конец ограничитель &amp;quot;|&amp;quot; - вообще-то, он нам не очень нужен, но в будущем, если &amp;quot;фреймворк&amp;quot; будет развиваться, может пригодиться. Если у нас правое значение - пишем &amp;quot;R&amp;quot; и само значение; ограничитель не нужен, его добавит функция сериализации этого правого значения. При десериализации - идём обратно. Остальные методы - в общем-то, там у нас почти единственное, что может быть.&lt;br /&gt;&lt;p&gt;Наконец, композиция. Для начала, заведём сам тип.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;newtype&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; f2 f1 a &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; (f2 (f1 a))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Сразу напишем функции, собирающие композицию или разбирающие обратно - вот тут нам и пригодятся методы &lt;code&gt;unit&lt;/code&gt; и &lt;code&gt;transform&lt;/code&gt;.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;mergeSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; f2 &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; f1 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f2 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; f2 f1 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;mergeSer&lt;/span&gt; f1u f2u &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; fmap (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f1u) f2u&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;fstSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f1, &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f2) &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; f2 f1 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f1 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;fstSer&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; ffu) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; transform ffu unit&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;sndSer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; f2 &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; f2 f1 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f2 &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;sndSer&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; ffu) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; fmap (const &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;) ffu&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И, соответственно, инстансы:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; f1, &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; f2) &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; f2 f1) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; fmap h (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; ffa) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; (fmap (fmap h) ffa)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f1, &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; f2) &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; f2 f1) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serialize ser (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; ffa) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; serialize (serialize ser) ffa&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; deserialize des &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; liftM &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; deserialize &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; deserialize des&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unit &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; embedSer unit&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transform (&lt;span style=&quot;color: #218a21&quot;&gt;Comp&lt;/span&gt; ffa) x &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; transform (transform ffa &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; embedSer x) x&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ура, с модулем сериализации покончено.&lt;br /&gt;&lt;p&gt;Следующим пунктом нашей программы будет преобразователь стрелок, который из произвольной стрелки сделает новую, имеющую &amp;quot;выхлоп&amp;quot;, причём, как я уже говорил ранее, вывод стрелки будет определяться тем, что пришло на вход, и &amp;quot;выхлопом&amp;quot;.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #b12121&quot;&gt;{-&lt;/span&gt;&lt;span style=&quot;color: #b12121&quot;&gt;# LANGUAGE Arrows, ExistentialQuantification #-}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt;, runEmitter, askEmitter, noEmission, emit) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Мы будем делать нашу новую стрелку, в частности, инстансом класса &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Category&lt;/span&gt;&lt;/code&gt;, для чего нам потребуется модуль &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Control.Category&lt;/span&gt;&lt;/code&gt;. Он, среди прочего, экспортирует функции &lt;code&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;id&lt;/span&gt;&lt;/code&gt; и &lt;code&gt;(&lt;span style=&quot;color: #0000ff&quot;&gt;.&lt;/span&gt;)&lt;/code&gt;, которые конфликтуют с аналогичными функциями в модуле &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Prelude&lt;/span&gt;&lt;/code&gt;. К счастью, они не просто так имеют те же имена - они обобщают функции &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Prelude&lt;/span&gt;&lt;/code&gt;. Поэтому, достаточно будет скрыть оригинальные, необобщённые версии:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Prelude&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;hiding&lt;/span&gt; (id, (&lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt;))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Далее, пара импортов, стандартных для любого модуля, работающего со стрелками.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Arrow&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Category&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И, наконец, импортируем предыдущий модуль, отвечающий за сериализацию.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь собственно преобразователь стрелок:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;data&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; forall emission&lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;SerializeFunctor&lt;/span&gt; emission &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (a input (emission &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;)) (input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; emission &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; output)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как я и обещал, вместо стрелки из входа в выход мы получаем стрелку из входа в &amp;quot;выхлоп&amp;quot; и функцию, восстанавливающую выход. Так как тип &amp;quot;выхлопа&amp;quot; не фиксирован, мы убираем его под экзистеншиал.&lt;br /&gt;&lt;p&gt;Мы не будем работать с &amp;quot;выхлопом&amp;quot; напрямую - мы будем везде использовать его сериализованный вид. Поэтому, мы заведём пару вспомогательных функций, которые будут делать (де-)сериализацию за нас.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;runEmitter&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; a input &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;runEmitter&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;^&lt;/span&gt; writeSer&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;askEmitter&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; output&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;askEmitter&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt; f) input str &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; f input &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; readSer str&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вопрос: а почему вместо засовывания типа под экзистеншиал не работать сразу со строками? Ответ: в принципе, можно, но тогда соединение нескольких таких стрелок в одну будет нетипизированным кошмаром - работать можно, но очень неудобно.&lt;br /&gt;&lt;p&gt;Нам также понадобится удобный способ конструировать такие преобразованные стрелки. Для начала, нам пригодится &amp;quot;умный&amp;quot; конструктор, преобразующий произвольную (ну, не совсем произвольную) стрелку так, чтобы новая стрелка не выдавала никакого выхлопа:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;noEmission&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; a input &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a input &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;noEmission&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (a &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;^&lt;/span&gt; makeId) (const fromId)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В &amp;quot;выхлопе&amp;quot; пойдёт тип &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Id&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt; - что, собственно, и означет &amp;quot;никакой информации&amp;quot;.&lt;br /&gt;&lt;p&gt;Кроме того, пригодится &amp;quot;умный&amp;quot; конструктор, позволяющий выдать такой &amp;quot;выхлоп&amp;quot;, какой нам захочется:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;emit&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a, &lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt; t) &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; a input (&lt;span style=&quot;color: #218a21&quot;&gt;Maybe&lt;/span&gt; t) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a input (&lt;span style=&quot;color: #218a21&quot;&gt;Either&lt;/span&gt; t &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;emit&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (a &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;^&lt;/span&gt; maybe (&lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;) &lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt;) (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; id)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Наконец, нужно, чтобы наши &amp;quot;преобразованные&amp;quot; стрелки оставались стрелками. Здесь все инстансы пишутся практически единственным образом:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Category&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; id &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; arr id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a2 e2 &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a1 e1 &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a e&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; emission1 &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; a1 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; emission2 &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; a2 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; e1 input emission1&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; mergeSer emission1 emission2&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e input emission &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; middle &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; e1 input &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; fstSer emission&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;in&lt;/span&gt; e2 middle &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; sndSer emission&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; arr f &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (proc input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; makeId &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;) (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;input &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f input)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; first (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a e) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (proc (input, &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input) (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;(input, z) emission &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; (e input emission, z))&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowChoice&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowChoice&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; left (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a e) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a&amp;#39; e&amp;#39;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; a&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc inputOrZ &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;case&lt;/span&gt; inputOrZ &lt;span style=&quot;color: #7f007f&quot;&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; z &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; unit&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e&amp;#39; (&lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; input) emission &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; e input emission&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e&amp;#39; (&lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; z) &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; z&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowLoop&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowLoop&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loop (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a e) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; a&amp;#39; e&amp;#39;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; a&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; rec {emission &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (input, z);&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; (&lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt;, z) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; e (input, z) emission;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; emission&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e&amp;#39; input emission &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; (output, z) &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; e (input, z) emission &lt;span style=&quot;color: #7f007f&quot;&gt;in&lt;/span&gt; output&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;С &amp;quot;выхлопом&amp;quot; разобрались.&lt;br /&gt;&lt;p&gt;Чтобы два раза не вставать, заодно определим трансформер стрелок, позволяющий стрелке хранить некое состояние.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #b12121&quot;&gt;{-&lt;/span&gt;&lt;span style=&quot;color: #b12121&quot;&gt;# LANGUAGE Arrows #-}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt;, runSeq, constSeq, state, chameleon) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Prelude&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;hiding&lt;/span&gt; (id, (&lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt;))&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Arrow&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Category&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Data.Maybe&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;У нас уже был такой трансформер &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1---1.html&quot;&gt;ранее&lt;/a&gt;. Он был таким:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #7f007f&quot;&gt;data&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;NetState&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; forall local&lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt; local, &lt;span style=&quot;color: #218a21&quot;&gt;Pointed&lt;/span&gt; local) &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;NetState&lt;/span&gt; (a (input, local) (output, local))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Раз мы готовы хранить состояние на сервере (и его, стало быть, не нужно сериализовать), ограничение &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Serialize&lt;/span&gt; local&lt;/code&gt; исчезает. При рефакторинге оказалось, что начальное состояние виджета не обязательно подавать во входном канале стрелки - что привело к следующему трансформеру:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #7f007f&quot;&gt;data&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Keeper&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; forall local&lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Pointed&lt;/span&gt; local &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; local &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Keeper&lt;/span&gt; (a input (output, local))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;А затем я подумал: ведь единственная функция, в которую будет подставляться состояние виджета - вот эта; что нам мешает &lt;strong&gt;заранее&lt;/strong&gt; произвести подстановку и исключить состояние вообще? Коль скоро мы не собираемся никуда его передавать - нам ничто не мешает так сделать. В результате, получается следующее:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;newtype&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; a input (output, &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a input output)}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Парочка &amp;quot;умных&amp;quot; конструкторов. Во-первых, стрелка, которая не хранит никакого состояния:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;constSeq&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a input output&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;constSeq&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; c &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;^&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; (output, c)} &lt;span style=&quot;color: #7f007f&quot;&gt;in&lt;/span&gt; c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Кроме того, нам понадобится стрелка, которая &lt;strong&gt;только&lt;/strong&gt; хранит состояние (на этот раз - произвольного типа) и ничего больше не делает.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;state&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; local &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a (local &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; local) local&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;state&lt;/span&gt; local &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; s} &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; proc localTransform &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; local&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; localTransform local &lt;span style=&quot;color: #7f007f&quot;&gt;in&lt;/span&gt; (local&amp;#39;, state local&amp;#39;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Здесь аргумент функции - это начальное состояние стрелки.&lt;br /&gt;&lt;p&gt;Снова объявим наши &amp;quot;преобразованные&amp;quot; стрелки стрелками; опять все инстансы пишутся практически без каких-либо вариантов: каждый раз мы берём выходное значение из &amp;quot;вложенной&amp;quot; стрелки.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Category&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; id &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; arr id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s2 &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; s1 &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; s}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; (middle, s1&amp;#39;) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; runSeq s1 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (output, s2&amp;#39;) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; runSeq s2 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; middle&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (output, s2&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; s1&amp;#39;)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Arrow&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; arr f &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; arr &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; (f input, arr f)}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; first s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; s&amp;#39;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; s&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc (input, z) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; (output, sq) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; runSeq s &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; ((output, z), first sq)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowChoice&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowChoice&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; left s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; s&amp;#39;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; s&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc inputOrZ &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;case&lt;/span&gt; inputOrZ &lt;span style=&quot;color: #7f007f&quot;&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; (output, sq) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; runSeq s &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Left&lt;/span&gt; output, left sq)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; z &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Right&lt;/span&gt; z, left s)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowLoop&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowLoop&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loop s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; s&amp;#39;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; s&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc input &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; rec {((output, z), sq) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; runSeq s &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (input, z)}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (output, loop sq)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И, наконец, кусочек того, что просили: виджет-хамелеон. Он будет принимать на входе один &amp;quot;обычный&amp;quot; параметр, а другой, &lt;strong&gt;возможно&lt;/strong&gt;, будет содержать следующий виджет - который заменит то, что идёт на выход:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;chameleon&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;ArrowChoice&lt;/span&gt; a &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a input output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a (input, &lt;span style=&quot;color: #218a21&quot;&gt;Maybe&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; a input output)) output&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;chameleon&lt;/span&gt; s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; {runSeq &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; s&amp;#39;} &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc (input, mSeq) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; (output, sq) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; runSeq s &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; input&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (output, chameleon &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; fromMaybe sq mSeq)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Займёмся теперь тем, что происходит на нижнем уровне. Практически, мы это уже делали - в &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1---2.html&quot;&gt;одной из предыдущих серий&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;Для начала - маленький служебный модуль, который, по уму, должен бы быть в стандартной библиотеке, рядом с классом &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;MonadPlus&lt;/span&gt;&lt;/code&gt;:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt;(&lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt;(&lt;span style=&quot;color: #b8850a&quot;&gt;..&lt;/span&gt;)) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt; f &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; azero &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; f a&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; aplus &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; f a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f a &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Единственное, чем этот класс отличается от &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;MonadPlus&lt;/span&gt;&lt;/code&gt;, так это тем, что он унаследован не от &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Monad&lt;/span&gt;&lt;/code&gt;, а от &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt;&lt;/code&gt;.&lt;br /&gt;&lt;p&gt;Вводили мы этот класс не зря. Сейчас мы предьявим один его инстанс:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt;(&lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt;, render, staticText, makeLink) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Data.Monoid&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Импортируем предыдущий модуль:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И, собственно, наш основной (и, по совместительству единственный) аддитивный функтор:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;newtype&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; link html x &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; {render &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; (x &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; link) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; html}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В общем, он должен быть знаком тем, кто читал &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1-3.html&quot;&gt;предыдущие серии&lt;/a&gt;. Он говорит о том, как надо отобразить некий тип данных; при этом единственное, что ему требуется - это указание, что писать в ссылках.&lt;br /&gt;&lt;p&gt;Соответственно, сразу вводим пару умных конструкторов. Первый позволяет отобразить текст без всяких ссылок:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;staticText&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; html &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; link html x&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;staticText&lt;/span&gt; html &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; {render &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; const html}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Второй - наоборот, отображает только ссылку; при этом на вопрос &amp;quot;как из ссылки сделать HTML&amp;quot; предполагается ответить позднее.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;makeLink&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; (link &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; html) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; x &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; link html x&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;makeLink&lt;/span&gt; display x &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; {render &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;linkMaker &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; display &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; linkMaker x}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Наконец, если мы умеем соединять куски HTML (а я думаю, мы умеем), то мы умеем и складывать эти рендеры - что позволит нам, скажем, сначала отрендерить одну часть, а потом другую.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Functor&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; link html) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; fmap f r &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; {render &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;h &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; render r &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; h &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; f}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Monoid&lt;/span&gt; html &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; link html) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; azero &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; {render &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; const mempty}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; r1 &lt;span style=&quot;color: #b8850a&quot;&gt;`aplus`&lt;/span&gt; r2 &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; {render &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;linkMaker &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; render r1 linkMaker &lt;span style=&quot;color: #b8850a&quot;&gt;`mappend`&lt;/span&gt; render r2 linkMaker}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ещё один модуль, отвечающий как раз за передачу сигналов от одного виджета к другому. Как оказалось, это вполне можно сделать не стрелкой, а &lt;strong&gt;монадой&lt;/strong&gt;.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt;(&lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt;, makeSignal, pure, effect) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Monad.Fix&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Заметьте, что мы не импортируем модуль &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt;&lt;/code&gt; - нам сейчас неважно, какой аддитивный функтор будет отвечать за отображение виджета, нас интересует только передача сигналов.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;data&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; f output &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; {pure &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; output, effect &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; f output}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;makeSignal&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; f output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; f output&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;makeSignal&lt;/span&gt; output foutput &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; {pure &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; output, effect &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; foutput}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Я снова предпочитаю не экспортировать конструктор.&lt;br /&gt;&lt;p&gt;Ну, собственно, монада. Метод &lt;code&gt;return&lt;/code&gt; не отображает ничего вообще. Метод &lt;code&gt;(&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt;)&lt;/code&gt; отображает сначала один виджет, а потом другой:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Monad&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; f) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return output &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; {pure &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; output, effect &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; azero}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; h &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; s&amp;#39; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; h &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; pure s &lt;span style=&quot;color: #7f007f&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; {pure &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; pure s&amp;#39;, effect &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; fmap (pure &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; h) (effect s) &lt;span style=&quot;color: #b8850a&quot;&gt;`aplus`&lt;/span&gt; effect s&amp;#39;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;instance&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Additive&lt;/span&gt; f &lt;span style=&quot;color: #b8850a&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;MonadFix&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; f) &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt; mfix h &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; h &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; fix &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; pure &lt;span style=&quot;color: #b8850a&quot;&gt;.&lt;/span&gt; h&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;А теперь - собираем всё воедино.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Импортируем всё, что надо.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Arrow&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Monad&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Скажем, какой именно тип будут иметь ссылки и весь HTML.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;type&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Link&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;type&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Может быть, это и не лучший выбор с точки зрения производительности, но мы делаем прототип, даже игрушку, а не промышленный фреймворк.&lt;br /&gt;&lt;p&gt;Сразу заведём функции для вывода ссылок и статического текста:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;display&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Link&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;display&lt;/span&gt; caption link &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; [caption &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot; &amp;lt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; link &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt;]&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;oneString&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;oneString&lt;/span&gt; s &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; [s]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Наконец, то, о необходимости чего так долго твердили большевики. Собственно виджеты:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;type&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Emitter&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Kleisli&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Signal&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Render&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Link&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt;))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Много всего, да.&lt;br /&gt;&lt;p&gt;Парочка функций. Одна отображает текущий виджет:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;runWidget&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;runWidget&lt;/span&gt; w &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; render (effect &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; runKleisli (runEmitter &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; runSeq w) &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;) id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Другая - по виджету и его &amp;quot;выхлопу&amp;quot; выдаёт нам виджет, который нужно будет отобразить на следующем шаге:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;nextWidget&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; output&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;nextWidget&lt;/span&gt; w str &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; snd &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; askEmitter (runSeq w) &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; str&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Отдельной функции, которая по виджету и его &amp;quot;выхлопу&amp;quot; возвращает его текущий вывод, не будет. Не потому, что её нельзя написать; просто она нафиг никому не нужна.&lt;br /&gt;&lt;p&gt;Соорудим виджет, отображающий статический текст, без какого-либо взаимодействия с пользователем:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;label&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; constSeq &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; noEmission &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Kleisli&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;text &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; makeSignal &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; staticText &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; oneString text&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Константа. Никакого выхлопа. На выходе - всегда &lt;code&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt;. Что может быть проще?&lt;br /&gt;&lt;p&gt;Для второго виджета - ссылки - нам понадобится вспомогательная функция, устанавливающая изоморфизм двух простеньких типов, каждый из которых имеет ровно два значения:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;isLeft&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Either&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Bool&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;isLeft&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; either (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;True&lt;/span&gt;) (&lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;False&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Думаю, понять, что эта функция делает, проще по её типу, чем по реализации.&lt;br /&gt;&lt;p&gt;Собственно, виджет-ссылка:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;link&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;String&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Bool&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;link&lt;/span&gt; caption &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; constSeq &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; emit (&lt;span style=&quot;color: #218a21&quot;&gt;Kleisli&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; makeSignal &lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; makeLink (display caption) (&lt;span style=&quot;color: #218a21&quot;&gt;Just&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;)) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&amp;gt;^&lt;/span&gt; isLeft&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Снова константа, но на сей раз - с выхлопом.&lt;br /&gt;&lt;p&gt;Это - почти всё. Ещё нам нужен простенький сервер, который будет брать виджет и рисовать его на экране. После этого мы каждый раз будем вводить ему номер шага и URL из ссылки, эмулируя таким образом мышеклик по ней. Номер шага нужен для эмуляции того, что пользователь открыл страницу в новом окне и работает там, а потом вернулся к старому окну. Поэтому вместо одного виджета мы будем хранить список - опять же, сомнительно с точки зрения производительности, но вполне достаточно для игрушки.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;server&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; output &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;IO&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;server&lt;/span&gt; w &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; serverLoop &lt;span style=&quot;color: #218a21&quot;&gt;[]&lt;/span&gt; w&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serverLoop widgetList newWidget &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; newWidgetList &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; widgetList &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; [newWidget]&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; putStrLn &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;*** &amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; show (length widgetList) &lt;span style=&quot;color: #b8850a&quot;&gt;++&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot; ***&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; putStr &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; unlines &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; runWidget newWidget&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; putStr &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; getLine&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; when (not &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; null request) &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;let&lt;/span&gt; [reqIndex, reqEmission] &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; words request&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reqWidget &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; newWidgetList &lt;span style=&quot;color: #b8850a&quot;&gt;!!&lt;/span&gt; read reqIndex&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;in&lt;/span&gt; serverLoop newWidgetList &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; nextWidget reqWidget reqEmission&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Что здесь есть? А почти ничего. Выводим номер очередного шага. Рендерим страницу. Выводим приглашение (слямзенное из питоновского REPL-а). Получаем запрос. Проводим простейший парсинг - если запрос пустой, не делаем ничего, если непустой - берём из него номер шага и &amp;quot;выхлоп&amp;quot; (который и пойдёт в URL ссылки) и начинаем заново. Всё.&lt;br /&gt;&lt;p&gt;Как ни странно, всё работает. Чтобы убедиться в этом, запустим несколько тестов.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #b12121&quot;&gt;{-&lt;/span&gt;&lt;span style=&quot;color: #b12121&quot;&gt;# LANGUAGE Arrows #-}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Tests&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;where&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Control.Arrow&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Sequencer&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Html&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Первые пять тестов хорошо знакомы из предыдущих серий, последние два - новые.&lt;br /&gt;&lt;p&gt;Первый тест - ссылка, увеличивающая счётчик, текстовое поле, показывающее счётчик, и ссылка, обновляющая страницу.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test1&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; clicked &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; number &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state (0 &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; clicked &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; (&lt;span style=&quot;color: #b8850a&quot;&gt;+&lt;/span&gt; 1) &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; show number&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;refresh&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Проверяем:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;*Tests&amp;gt; &lt;/span&gt;&lt;strong&gt;server test1&lt;/strong&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;щёлкаем по первой ссылке&lt;/em&gt;&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 RL()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;теперь - по второй&lt;/em&gt;&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 L()|&lt;/strong&gt;&lt;br /&gt;*** 2 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;теперь - пару раз по первой&lt;/em&gt;&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;2 RL()|&lt;/strong&gt;&lt;br /&gt;*** 3 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;2&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;3 RL()|&lt;/strong&gt;&lt;br /&gt;*** 4 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;3&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;возвращаемся к одному из ранних шагов и проходим по другой ссылке&lt;/em&gt;&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 RL()|&lt;/strong&gt;&lt;br /&gt;*** 5 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;2&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;завершаем тест&lt;/em&gt;&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь второй тест - две ссылки, одна из которых увеличивает счётчки, а другая - уменьшает:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test2&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; increase &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; decrease &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; number &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state (0 &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;n &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; n &lt;span style=&quot;color: #b8850a&quot;&gt;+&lt;/span&gt; (&lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; increase &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; 1 &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; 0) &lt;span style=&quot;color: #b8850a&quot;&gt;-&lt;/span&gt; (&lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; decrease &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; 1 &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; 0)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; show number&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Тестируем:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;*Tests&amp;gt; &lt;/span&gt;&lt;strong&gt;server test2&lt;/strong&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 RL()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 RL()|&lt;/strong&gt;&lt;br /&gt;*** 2 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;2&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;2 L()|&lt;/strong&gt;&lt;br /&gt;*** 3 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Третий тест проверяет, можем ли мы использовать сложные виджеты как кирпичики для ещё более сложных. Мы повторяем предыдущий тест дважды, независимо:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test3&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; test2 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; test2 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Проверка:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;*Tests&amp;gt; &lt;/span&gt;&lt;strong&gt;server test3&lt;/strong&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;- &amp;lt;RRL()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 RRRL()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;- &amp;lt;RRL()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 L()|&lt;/strong&gt;&lt;br /&gt;*** 2 ***&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;- &amp;lt;RRL()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;-1&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;2 RRRL()|&lt;/strong&gt;&lt;br /&gt;*** 3 ***&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;- &amp;lt;RRL()|&amp;gt;&lt;br /&gt;2&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;-1&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;3 RL()|&lt;/strong&gt;&lt;br /&gt;*** 4 ***&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;- &amp;lt;RRL()|&amp;gt;&lt;br /&gt;2&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Четвёртый тест проверяет, как работают ветвления. Здесь у нас некий &amp;quot;визард&amp;quot; с двумя страницами, на первой - первый тест, на второй - соответственно, второй; плюс есть ссылка для переключения.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test4&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; switch &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;switch&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; displayFirst &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state &lt;span style=&quot;color: #218a21&quot;&gt;True&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; switch &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; not &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; displayFirst&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;first page&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; test1 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;second page&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; test2 &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Я вставил в одно место &lt;code&gt;returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;/code&gt;, потому что у &lt;code&gt;test1&lt;/code&gt; и &lt;code&gt;test2&lt;/code&gt; разные выходные типы.&lt;br /&gt;Прогон:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;*Tests&amp;gt; &lt;/span&gt;&lt;strong&gt;server test4&lt;/strong&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;switch &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;first page&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;refresh &amp;lt;RRL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 RRRL()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;switch &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;first page&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;refresh &amp;lt;RRL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 RRRRL()|&lt;/strong&gt;&lt;br /&gt;*** 2 ***&lt;br /&gt;switch &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;second page&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;0&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;2 L()|&lt;/strong&gt;&lt;br /&gt;*** 3 ***&lt;br /&gt;switch &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;second page&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;- &amp;lt;L()|&amp;gt;&lt;br /&gt;-1&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;3 RRRRL()|&lt;/strong&gt;&lt;br /&gt;*** 4 ***&lt;br /&gt;switch &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;first page&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;refresh &amp;lt;RRL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пятый тест проверяет, можем ли мы передавать сигналы назад - тому виджету, который в тексте раньше:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test5&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; rec {label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; show number;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; number &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state (0 &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; clicked &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; (&lt;span style=&quot;color: #b8850a&quot;&gt;+&lt;/span&gt; 1) &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; id;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; clicked &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;+1&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;refresh&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Можем:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;*Tests&amp;gt; &lt;/span&gt;&lt;strong&gt;server test5&lt;/strong&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;0&lt;br /&gt;+1 &amp;lt;RL()|&amp;gt;&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 RL()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;1&lt;br /&gt;+1 &amp;lt;RL()|&amp;gt;&lt;br /&gt;refresh &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Наконец, пара тестов на &amp;quot;хамелеончика&amp;quot;. Первый тест - допустим, некоторая функция генерирует заданное число текстовых строк:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;labels&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;labels&lt;/span&gt; 0 &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; returnA&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;labels&lt;/span&gt; n &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; labels (n&lt;span style=&quot;color: #b8850a&quot;&gt;-&lt;/span&gt;1) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; show n&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Можем ли мы сделать это число динамическим - не прошитым в виджет, а определяемым во время работы? Можем. Вот пример; здесь единственная ссылка увеличивает это самое число:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test6&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; clicked &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; num &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state (0 &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; clicked &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; (&lt;span style=&quot;color: #b8850a&quot;&gt;+&lt;/span&gt; 1) &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chameleon (labels 0) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;, &lt;span style=&quot;color: #218a21&quot;&gt;Just&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; labels num)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И вот как это работает:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;+ &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 L()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;+ &amp;lt;L()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 L()|&lt;/strong&gt;&lt;br /&gt;*** 2 ***&lt;br /&gt;+ &amp;lt;L()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;2 L()|&lt;/strong&gt;&lt;br /&gt;*** 3 ***&lt;br /&gt;+ &amp;lt;L()|&amp;gt;&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Второй тест. Пусть, опять же, функция возвратит нам заданное число ссылок. На выходе нашего виджета будет номер ссылки, по которой пользователь щёлкнул:&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;links&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Widget&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;Maybe&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;links&lt;/span&gt; 0 &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt; arr &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; const &lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;links&lt;/span&gt; n &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; mI &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; links (n&lt;span style=&quot;color: #b8850a&quot;&gt;-&lt;/span&gt;1) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; last &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link (show n) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; last &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Just&lt;/span&gt; n &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; mI&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вставим её в наш виджет, так, чтобы щелчок по одной из этих &amp;quot;динамических&amp;quot; ссылок показывал нам страницу с номером и ссылкой &amp;quot;назад&amp;quot;.&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;test7&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; rec {(answer, &lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state (&lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt;, &lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;\&lt;/span&gt;(&lt;span style=&quot;color: #7f007f&quot;&gt;_&lt;/span&gt;, b) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt; (b, prevAnswer);&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; prevAnswer &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;case&lt;/span&gt; answer &lt;span style=&quot;color: #7f007f&quot;&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; clicked &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;+&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; num &lt;span style=&quot;color: #b8850a&quot;&gt;&amp;lt;-&lt;/span&gt; state (0 &lt;span style=&quot;color: #b8850a&quot;&gt;::&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Integer&lt;/span&gt;) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #7f007f&quot;&gt;if&lt;/span&gt; clicked &lt;span style=&quot;color: #7f007f&quot;&gt;then&lt;/span&gt; (&lt;span style=&quot;color: #b8850a&quot;&gt;+&lt;/span&gt; 1) &lt;span style=&quot;color: #7f007f&quot;&gt;else&lt;/span&gt; id&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chameleon (links 0) &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; (&lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;, &lt;span style=&quot;color: #218a21&quot;&gt;Just&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;$&lt;/span&gt; links num)&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #218a21&quot;&gt;Just&lt;/span&gt; n &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style=&quot;color: #7f007f&quot;&gt;do&lt;/span&gt; label &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; show n&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; link &lt;span style=&quot;color: #bb8f8f&quot;&gt;&amp;quot;back&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;Nothing&lt;/span&gt;;}&lt;br /&gt;&lt;span style=&quot;color: #b8850a&quot;&gt;&amp;gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnA &lt;span style=&quot;color: #b8850a&quot;&gt;-&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #218a21&quot;&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Обратите внимание на фокус с виджетом &lt;code&gt;state&lt;/code&gt; - он предназначен для &lt;strong&gt;задержки&lt;/strong&gt; нового состояния - если мы попытаемся установить новое состояние сразу, то страница благополучно зависнет (что вполне разумно).&lt;br /&gt;&lt;pre style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;*Tests&amp;gt; &lt;/span&gt;&lt;strong&gt;server test7&lt;/strong&gt;&lt;br /&gt;*** 0 ***&lt;br /&gt;+ &amp;lt;RL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;0 RL()|&lt;/strong&gt;&lt;br /&gt;*** 1 ***&lt;br /&gt;+ &amp;lt;RRL()|&amp;gt;&lt;br /&gt;1 &amp;lt;RL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;1 RRL()|&lt;/strong&gt;&lt;br /&gt;*** 2 ***&lt;br /&gt;+ &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;1 &amp;lt;RRL()|&amp;gt;&lt;br /&gt;2 &amp;lt;RL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;2 RRRL()|&lt;/strong&gt;&lt;br /&gt;*** 3 ***&lt;br /&gt;+ &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;1 &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;2 &amp;lt;RRL()|&amp;gt;&lt;br /&gt;3 &amp;lt;RL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;3 RRL()|&lt;/strong&gt;&lt;br /&gt;*** 4 ***&lt;br /&gt;2&lt;br /&gt;back &amp;lt;L()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;strong&gt;4 L()|&lt;/strong&gt;&lt;br /&gt;*** 5 ***&lt;br /&gt;+ &amp;lt;RRRRL()|&amp;gt;&lt;br /&gt;1 &amp;lt;RRRL()|&amp;gt;&lt;br /&gt;2 &amp;lt;RRL()|&amp;gt;&lt;br /&gt;3 &amp;lt;RL()|&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: #00008a&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Здесь мы увеличили количество ссылок до трёх, а затем щёлкнули по второй.&lt;br /&gt;&lt;p&gt;Вопросы? Замечания?&lt;/p&gt;&lt;/p&gt;     &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%B8%D0%B3%D1%80%D1%83%D1%88%D0%B5%D1%87%D0%BD%D1%8B%D0%B9-%D0%B2%D0%B5%D0%B1-20.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f00050123ddbe1123860b?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Мысли в кучу</title>
            <link>http://migmit.vox.com/library/post/%D0%BC%D1%8B%D1%81%D0%BB%D0%B8-%D0%B2-%D0%BA%D1%83%D1%87%D1%83.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%BC%D1%8B%D1%81%D0%BB%D0%B8-%D0%B2-%D0%BA%D1%83%D1%87%D1%83.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%BC%D1%8B%D1%81%D0%BB%D0%B8-%D0%B2-%D0%BA%D1%83%D1%87%D1%83.html?_c=feed-rss-full</guid> 
            <pubDate>Wed, 14 Oct 2009 01:14:15 +0400</pubDate>         
            
            <description>    &lt;p&gt;Смотрю новый сериал FlashForward. Сюжет пересказывать не буду, желающие узнают всё необходимое, например, &lt;a href=&quot;http://geroneja.diary.ru&quot;&gt;вот здесь&lt;/a&gt;. Просто соберу в кучу некоторые вопросы и теории, а потом посмотрим - что из этого оправдается, и на что будет дан ответ.&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;То, в чём я не сомневаюсь.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;&lt;ol&gt;&lt;li&gt;Никаких инопланетян, ангелов, чертей, вампиров (увы), господа бога или Святого Ника. Если другой разум - отличный от человеческого - появится в последней серии, то это будет совершенно дикий рояль в кустах. Если не в последней - тот факт, что именно эти гады виноваты в происшедшем, станет, к сожалению, очевидным.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Никакой мистики вообще. Если бы в этом сериале была возможна мистика - она бы уже проявилась, три серии, как-никак.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Не природный катаклизм. Слишком легко списать всё на стихию. Обесценивает всё проведённое расследование.&lt;/li&gt;&lt;/ol&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Теории&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;&lt;ol&gt;&lt;li&gt;Теория темпорального эха. Пока что все персонажи считают, что, кто бы ни стоял за происшедшим, он уже всё сделал. Нажал кнопку, или что там ещё. Но, поскольку мы и так имеем дело с временной аномалией, почему не допустить, что всё произойдёт 29 марта (30-го в Европе), а имевшее место затемнение - просто эхо, откатившееся НАЗАД во времени.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Теория шахматиста. Только у меня возникает ощущение, что наши ФБР-овцы не столько расследование ведут, сколько реагируют на ниточки, которые кто-то осознанно дёргает? И если да, то не может ли быть так, что цель затемнения - или одна из целей - это добиться того, чтобы главные герои сделали что-то или оказались где-то?&lt;/li&gt;&lt;/ol&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Вопросы&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;&lt;ol&gt;&lt;li&gt;Может ли вообще наступить то будущее, которое было в видениях? Ни в жисть не поверю, что не найдётся человек, достаточно упрямый, чтобы просто назло судьбе сделать наоборот. В конце концов, для этого не много нужно. Один из ФБР-овцев говорил, если не вру, что в его видении он смотрел новости по телевизору. Что ему будет стоить выключить телевизор в соответствующее время, тем более, что оно хорошо известно. С другой стороны, некоторые, по-видимому, должны к этому времени умереть. Возможно, события подгадают таким образом, чтобы именно эти упрямцы и умерли?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Дима Но. С одной стороны, похоже, он умрёт. С другой стороны, слишком уж активно нас подталкивают к тому, что именно это и должно случиться. И именно это, в свою очередь, напоминает о теории шахматиста - сначала Димке подсунули шерифшу, которая тут же и умерла, потом последовал звонок фиг знает откуда. Ему как бы не говорят прямым текстом (звонок по телефону не есть прямой текст, ибо его таинственность внушает сомнения), а подводят к такому убеждению. Возможно, шахматист хочет, чтобы Димка верил, что умрёт - как, скажем, в Drive профессор верил в свою обречённость, и в результате действовал так, как никогда бы не подумал действовать, будь его здоровье в порядке.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Нулевой. Поведение этого товарища очень странно. Если он не знал о затемнении - то почему вёл себя так спокойно? Не паниковал, даже не торопился найти какое-нибудь укрытие (то, что сделал бы я). Спокойно прошёл по трибуне и удалился. Может быть, он душевнобольной? Интересно, аутисты посещают спортивные мероприятия, или им до фени? Если он знал - почему он вообще оказался на этом стадионе? Почему не отсиделся дома? Если он хотел понаблюдать за толпой - кто мешал ему выбрать местечко на крыше небоскрёба и смотреть на какую-нибудь оживлённую улицу? Может, он хотел запечатлеться на камеру? Согласуется с теорией шахматиста, но что-то в этом направлении никакого продвижения пока не видно. Может быть, он не ЗНАЛ о затемнении, но быстро всё понял? Скажем, если это талантливый физик, который зарание просчитал, что что-то подобное может быть результатом, например, включения Большого Гудронного Уклайдера? Кстати, это согласуется с теорией темпорального эха. А по телефону он тогда разговаривал со своим приятелем, который тоже был в курсе этой теории - Алё, Вовка? У тебя там такой же бардак, как и здесь? А что я тебе говорил? Вот-вот, и не зря мы те таблетки принимали, а то тоже валялись бы по земле.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ди Гиббонс. Разговор по телефону с Нулевым согласуется с гипотезой, что они хотели быть обнаруженными (трудно было бы представить, что ФБР не узнает рано или поздно, что во время затемнения случился разговор по телефону) - и с теорией шахматиста. С другой стороны, как сказано в предыдущем пункте, может согласовываться и с теорией темпорального эха. Что о нём знает Чарли и почему она называет Гиббонса &amp;quot;Ди&amp;quot;? Не &amp;quot;Дэвид Гиббонс&amp;quot;, не &amp;quot;мистер Гиббонс&amp;quot;, а именно &amp;quot;Ди&amp;quot;? Может быть, имя Гиббонса было где-нибудь написано? Умеет ли Чарли в её возрасте читать? Вероятно, да. Не является ли &amp;quot;Ди Гиббонс&amp;quot; кивком в сторону Дейва Гиббонса, соавтора &amp;quot;Вотчменов&amp;quot;? Последнее уже к загадкам сериала не относится.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Герр Гейер. Уж больно аккуратно он их развёл. Кто знает, может быть, его освобождение было одной из целей шахматиста (буде таковой существует)?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Сам феномен бодрствования во время затемнения. Поведение Нулевого может быть объяснено разными причинами, а вот его телефонный разговор с другим бодрствующим практически доказывает, что они сохранили сознание не случайно. Они что-то делали для этого. С другой стороны, мальчик в сомалийском флэшбеке точно был никак не связан с организаторами безобразия. У него шрам на лице - может быть, это как-то связано с его бодрствованием? Согласуется с гипотезой о психическом заболевании. Возможно, Нулевой и Ди Гиббонс страдают одним и тем же заболеванием? Может быть, они подружились на сеансе групповой терапии и когда началось затемнении, один просто рефлекторно позвонил своему единственному другу? Согласуется с тем, что поведение Гиббонса во время попытки ареста было, скажем так, неадекватным. Однако неужели подобное - явно редкое - заболевание оставит после себя лишь небольшой шрам на лбу, причём в стране, где доктор Хаус не живёт?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Что это за фаллический символ стоял в Сомали и что за белая субстанция из него выплеснулась? Да, я осознаю, что вопрос пошлый.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Те спецназовцы в видении Марка. Они шли за ним? Или за Стэном? Если бы Стэн находился у себя, то он был бы поблизости - Марк его, помнится, даже спрашивал, не видел ли он чего-нибудь. Он в это время сидел в сортире, но киллеры могли этого не знать.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt; &lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BC%D1%8B%D1%81%D0%BB%D0%B8-%D0%B2-%D0%BA%D1%83%D1%87%D1%83.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f000501240b68fc1d860e?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Хозяйке на заметку</title>
            <link>http://migmit.vox.com/library/post/%D1%85%D0%BE%D0%B7%D1%8F%D0%B9%D0%BA%D0%B5-%D0%BD%D0%B0-%D0%B7%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D1%83.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D1%85%D0%BE%D0%B7%D1%8F%D0%B9%D0%BA%D0%B5-%D0%BD%D0%B0-%D0%B7%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D1%83.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D1%85%D0%BE%D0%B7%D1%8F%D0%B9%D0%BA%D0%B5-%D0%BD%D0%B0-%D0%B7%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D1%83.html?_c=feed-rss-full</guid> 
            <pubDate>Wed, 07 Oct 2009 01:03:04 +0400</pubDate>         
            
            <description>    &lt;p&gt;Текущие настройки mencoder-а для конвертации видео на айфон:&lt;/p&gt;&lt;p&gt;mencoder &lt;strong&gt;&lt;em&gt;источник&lt;/em&gt;&lt;/strong&gt;.avi -o &lt;strong&gt;&lt;em&gt;результат&lt;/em&gt;&lt;/strong&gt;.mp4 -vf dsize=480:320:0,scale=-8:-8,harddup -oac faac -faacopts mpeg=4:object=2:raw:br=128 -of lavf -lavfopts format=mp4 -ovc x264 -x264encopts nocabac:level_idc=30:bframes=0:global_header:threads=auto:subq=5:frameref=6:partitions=all:trellis=1:chroma_me:me=umh:bitrate=500:no8x8dct &lt;/p&gt;&lt;p&gt;Вот так вот.&lt;br /&gt; &lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D1%85%D0%BE%D0%B7%D1%8F%D0%B9%D0%BA%D0%B5-%D0%BD%D0%B0-%D0%B7%D0%B0%D0%BC%D0%B5%D1%82%D0%BA%D1%83.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f00050123f168d194860f?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Code Jam</title>
            <link>http://migmit.vox.com/library/post/code-jam.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/code-jam.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/code-jam.html?_c=feed-rss-full</guid> 
            <pubDate>Sat, 26 Sep 2009 22:36:14 +0400</pubDate>         
            
            <description>    &lt;p&gt;Итак, оно кончилось. 759 место, дальше не прохожу. Решил первую задачу и первую часть третьей - оно таки обломалось на large set. Вывод: с некоторыми базовыми алгоритмами у меня, всё-таки, плохо.&lt;br /&gt;&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/code-jam.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f00050123f164d649860f?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Почувстовал себя персонажем анекдота</title>
            <link>http://migmit.vox.com/library/post/%D0%BF%D0%BE%D1%87%D1%83%D0%B2%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D0%BB-%D1%81%D0%B5%D0%B1%D1%8F-%D0%BF%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0%D0%B6%D0%B5%D0%BC-%D0%B0%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%BF%D0%BE%D1%87%D1%83%D0%B2%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D0%BB-%D1%81%D0%B5%D0%B1%D1%8F-%D0%BF%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0%D0%B6%D0%B5%D0%BC-%D0%B0%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%BF%D0%BE%D1%87%D1%83%D0%B2%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D0%BB-%D1%81%D0%B5%D0%B1%D1%8F-%D0%BF%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0%D0%B6%D0%B5%D0%BC-%D0%B0%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full</guid> 
            <pubDate>Tue, 01 Sep 2009 20:49:44 +0400</pubDate>         
            
            <description>    &lt;p&gt;когда набрал в терминале &amp;quot;which watch&amp;quot;. &lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BF%D0%BE%D1%87%D1%83%D0%B2%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D0%BB-%D1%81%D0%B5%D0%B1%D1%8F-%D0%BF%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0%D0%B6%D0%B5%D0%BC-%D0%B0%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82%D0%B0.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f00050110164b36d4860b?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Первый аплоад на Hackage</title>
            <link>http://migmit.vox.com/library/post/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B0%D0%BF%D0%BB%D0%BE%D0%B0%D0%B4-%D0%BD%D0%B0-hackage.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B0%D0%BF%D0%BB%D0%BE%D0%B0%D0%B4-%D0%BD%D0%B0-hackage.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B0%D0%BF%D0%BB%D0%BE%D0%B0%D0%B4-%D0%BD%D0%B0-hackage.html?_c=feed-rss-full</guid> 
            <pubDate>Mon, 17 Aug 2009 09:25:58 +0400</pubDate>         
            
            <description>    &lt;p&gt;compose-trans-0.0&lt;/p&gt;&lt;p&gt;Сделан по мотивам вот &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B-%D0%BA%D0%B0%D0%BA-%D1%82%D0%B8%D0%BF%D1%8B.html&quot;&gt;этого&lt;/a&gt; поста. Очень сильно отрефакторено и упрощено. &lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B0%D0%BF%D0%BB%D0%BE%D0%B0%D0%B4-%D0%BD%D0%B0-hackage.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f000501101643ebbe860b?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Какой австралопитек</title>
            <link>http://migmit.vox.com/library/post/%D0%BA%D0%B0%D0%BA%D0%BE%D0%B9-%D0%B0%D0%B2%D1%81%D1%82%D1%80%D0%B0%D0%BB%D0%BE%D0%BF%D0%B8%D1%82%D0%B5%D0%BA.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%BA%D0%B0%D0%BA%D0%BE%D0%B9-%D0%B0%D0%B2%D1%81%D1%82%D1%80%D0%B0%D0%BB%D0%BE%D0%BF%D0%B8%D1%82%D0%B5%D0%BA.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%BA%D0%B0%D0%BA%D0%BE%D0%B9-%D0%B0%D0%B2%D1%81%D1%82%D1%80%D0%B0%D0%BB%D0%BE%D0%BF%D0%B8%D1%82%D0%B5%D0%BA.html?_c=feed-rss-full</guid> 
            <pubDate>Mon, 10 Aug 2009 13:07:44 +0400</pubDate>         
            
            <description>    &lt;p&gt;делал функцию &amp;quot;Родительский контроль&amp;quot; в винде? Неужели он не мог посмотреть хотя бы на макось? Как вообще в его микроскопический мозг пришла мысль, что родитель должен задавать не общее время, которое чадо проводит за компом, а конкретные часы? Не &amp;quot;два часа в день&amp;quot;, а &amp;quot;с 17:30 до 19:30&amp;quot;? Или эта хуйня разрабатывалась изначально для использования в пенитенциарных учреждениях?&lt;/p&gt;&lt;p&gt;Почему, интересно, в макоси, да и в любом другом юниксе, никого не ебёт, какие программы юзер установит для себя лично, главное, чтобы не пытался лезть в чужие данные - а в этой куче дерьма под названием Vista по умолчанию установка софта запрещена всем не-админам? Это надо понимать как признание, что ихний выкидыш представляет собой глюк на глюке, который упадёт от первого залетевшего дятла? Какого хрена? Раньше я думал, что под админом работают только идиоты. Похоже, что в винде другого варианта вообще нет.&lt;/p&gt;&lt;p&gt;Ощущение такое, что виста - это не ОС, а демка. А винда Home Basic, которая шла вместе с компом - демка от демки. Повбывав бы. Уроды. Все.&lt;br /&gt; &lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BA%D0%B0%D0%BA%D0%BE%D0%B9-%D0%B0%D0%B2%D1%81%D1%82%D1%80%D0%B0%D0%BB%D0%BE%D0%BF%D0%B8%D1%82%D0%B5%D0%BA.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f0005011016854ff3860c?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
 
        <item>
            <title>Просто забавно</title>
            <link>http://migmit.vox.com/library/post/%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE-%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D0%BE.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE-%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D0%BE.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE-%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D0%BE.html?_c=feed-rss-full</guid> 
            <pubDate>Tue, 30 Jun 2009 22:27:24 +0400</pubDate>         
            
            <description>    &lt;p&gt;Вчера всем, конечно, было не до того. Но сегодня должны были уже отойти, так что:&lt;br /&gt;
    
    
    

    
    
    
&lt;div at:enclosure=&quot;asset&quot; at:xid=&quot;6a00e398c5c26f00050110166a9dd1860c&quot; at:format=&quot;extra-large&quot; at:align=&quot;center&quot;
    class=&quot;enclosure enclosure-center enclosure-extra-large photo-enclosure&quot; 
     style=&quot;text-align: center;&quot;&gt;
&lt;div class=&quot;enclosure-inner&quot;
    
        style=&quot;padding: 9px; border: 1px solid; width: px; margin: 10px auto;&quot;
    &gt;
    &lt;div class=&quot;enclosure-list&quot;&gt;
        &lt;div class=&quot;enclosure-item photo-asset last&quot;&gt;
    
            &lt;div class=&quot;enclosure-image&quot;&gt;
        
                &lt;a href=&quot;http://migmit.vox.com/library/photo/6a00e398c5c26f00050110166a9dd1860c.html&quot;&gt;&lt;img src=&quot;http://a1.vox.com/6a00e398c5c26f00050110166a9dd1860c-500pi&quot; alt=&quot;Picture 1&quot; title=&quot;Picture 1&quot; /&gt;&lt;/a&gt;
        
            &lt;/div&gt;
            &lt;div class=&quot;enclosure-meta&quot;&gt;
                &lt;div class=&quot;enclosure-asset-name&quot;&gt;&lt;a href=&quot;http://migmit.vox.com/library/photo/6a00e398c5c26f00050110166a9dd1860c.html&quot; title=&quot;Picture 1&quot;&gt;Picture 1&lt;/a&gt;&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- end enclosure --&gt;

&lt;br /&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE-%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D0%BE.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f000501101625bcd3860b?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>    
        </item> 
 
        <item>
            <title>Ну и денёк</title>
            <link>http://migmit.vox.com/library/post/%D0%BD%D1%83-%D0%B8-%D0%B4%D0%B5%D0%BD%D1%91%D0%BA.html?_c=feed-rss-full</link>   
            <author>nobody@vox.com(migmit)</author>
            <comments>http://migmit.vox.com/library/post/%D0%BD%D1%83-%D0%B8-%D0%B4%D0%B5%D0%BD%D1%91%D0%BA.html?_c=feed-rss-full</comments>
            <guid isPermaLink="true">http://migmit.vox.com/library/post/%D0%BD%D1%83-%D0%B8-%D0%B4%D0%B5%D0%BD%D1%91%D0%BA.html?_c=feed-rss-full</guid> 
            <pubDate>Tue, 16 Jun 2009 22:05:30 +0400</pubDate>         
            
            <description>    &lt;p&gt;Началось, как обычно, с мелочи. Дизайнеры сделали новую модель игрока, заменив устрашающий солдафонский костюм на футболку и джинсы, не менее устрашающие. В какой-то момент игрок посмотрел в небо, слегка отклонившись при этом назад. С другой позиции сразу стало видно, как автомат, висевший у игрока за спиной, прошёл у него между ногами и нагло торчит дулом аккурат из ширинки. Особо впечатлительные крестились и украдкой прикасались к томику Фрейда.&lt;br /&gt;А потом пришла дверь. Обыкновенная дверь, которая просто не открывалась. До тех пор, пока её не переключали из режима физики в режим анимации, в котором она медленно открывалась, быстро захлопывалась и делала goto :begin. И надо же было именно на ней тестировать новый режим - когда работает и физика, и анимация сразу. Дверь начала исполнять танец пьяного ёжика вокруг косяка, вылетая далеко за запланированные пределы её перемещений. Испуганный девелопер выключил анимацию. Дверь пришла в себя, снялась с петель и, издевательски вращаясь вокруг вертикальной оси, улетела за горизонт.&lt;br /&gt;Под конец сисадмин попросил зашедшего к нему по какой-то надобности директора налить ему чаю, потому как он сам, видите ли, до сих пор не сумел разобраться в управлении чайником.&lt;br /&gt;Что-то будет завтра...&lt;br /&gt; &lt;/p&gt;    &lt;p style=&quot;clear:both;&quot;&gt; 
    &lt;a href=&quot;http://migmit.vox.com/library/post/%D0%BD%D1%83-%D0%B8-%D0%B4%D0%B5%D0%BD%D1%91%D0%BA.html?_c=feed-rss-full#comments&quot;&gt;Read and post comments&lt;/a&gt;   |   
    &lt;a href=&quot;http://www.vox.com/share/6a00e398c5c26f000501101660a212860c?_c=feed-rss-full&quot;&gt;Send to a friend&lt;/a&gt; 
&lt;/p&gt;
 
            </description>   
        </item> 
    </channel>
</rss>

