<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
  <channel>
    <title>10 PRINT &quot;ERIK&quot; 20 GOTO 10</title>
    <link>http://blog.turbofriendship.com</link>
    <description>mostly programming</description>
    <language>en-us</language>           
    <generator>Nucleus CMS v3.32</generator>
    <copyright>Ã¯Â¿Â½</copyright>             
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://blog.turbofriendship.com/nucleus/nucleus2.gif</url>
      <title>10 PRINT &quot;ERIK&quot; 20 GOTO 10</title>
      <link>http://blog.turbofriendship.com</link>
    </image>
    <item>
 <title>f# wraper for Rx framework</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=107</link>
<description><![CDATA[according to <a href="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html">jafar husain</a> the people now have access to the awesome rx framework library.<br />
<br />
this is great except you can not use it easily from f#<br />
with this library wrapper you can access all the observable methods from the module OSeq and build observable collections using the oseq monad builder. <br />
<br />
following is the interesting bits of an example that shows both,  it encapsulates a triple-click:<br />
("win" is a System.Windows.Window)<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">open</span> Microsoft<span style="color: #a52a2a;">.</span><span style="color: #060;">FSharp</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Collections</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> mousedown <span style="color: #a52a2a;">=</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">from_event</span> win<span style="color: #a52a2a;">.</span><span style="color: #060;">MouseDown</span><br />
<span style="color: #06c; font-weight: bold;">let</span> mouseup <span style="color: #a52a2a;">=</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">from_event</span> win<span style="color: #a52a2a;">.</span><span style="color: #060;">MouseUp</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> trippleclick <span style="color: #a52a2a;">=</span> oseq <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">for</span> x <span style="color: #06c; font-weight: bold;">in</span> mousedown <span style="color: #a52a2a;">|&gt;</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">waitUntil</span> mouseup <span style="color: #a52a2a;">|&gt;</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">take</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> mili <span style="color: #a52a2a;">=</span> DateTime<span style="color: #a52a2a;">.</span><span style="color: #060;">Now</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Ticks</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">for</span> y <span style="color: #06c; font-weight: bold;">in</span> mousedown <span style="color: #a52a2a;">|&gt;</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">waitUntil</span> mouseup <span style="color: #a52a2a;">|&gt;</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">take</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">for</span> z <span style="color: #06c; font-weight: bold;">in</span> mousedown <span style="color: #a52a2a;">|&gt;</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">waitUntil</span> mouseup <span style="color: #a52a2a;">|&gt;</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">take</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> DateTime<span style="color: #a52a2a;">.</span><span style="color: #060;">Now</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Ticks</span> <span style="color: #a52a2a;">-</span> mili <span style="color: #a52a2a;">&lt;</span> <span style="color: #6c6;">&#40;</span>int64 <span style="color: #c6c;">5000000</span><span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yield <span style="color: #3cb371;">&quot;click&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return<span style="color: #a52a2a;">!</span> trippleclick<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">else</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return<span style="color: #a52a2a;">!</span> trippleclick<br />
<span style="color: #6c6;">&#125;</span> <br />
&nbsp;</div><br />
<br />
the following library does not presently wrap every observable function but is already quite useful.<br />
<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">module</span> Microsoft<span style="color: #a52a2a;">.</span><span style="color: #060;">FSharp</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Collections</span><br />
<br />
<span style="color: #06c; font-weight: bold;">open</span> System<br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Linq</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Collections</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Generic</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Linq</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Expressions</span><br />
<br />
<span style="color: #06c; font-weight: bold;">module</span> OSeq <span style="color: #a52a2a;">=</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">type</span> ObservableBuilder<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Bind</span><span style="color: #6c6;">&#40;</span>a, f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">SelectMany</span><span style="color: #6c6;">&#40;</span>a, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b IObservable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Return</span> x <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Return</span> x<br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Delay</span> f <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Defer</span><span style="color: #6c6;">&#40;</span>Func<span style="color: #a52a2a;">&lt;'</span>a IObservable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Yield</span> x <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Return</span> x<br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">For</span><span style="color: #6c6;">&#40;</span>a, f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">SelectMany</span><span style="color: #6c6;">&#40;</span>a, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b IObservable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>member this<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">While</span> <span style="color: #a52a2a;">:</span> <span style="color: #6c6;">&#40;</span>unit <span style="color: #a52a2a;">-&gt;</span> bool<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">*</span> M<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span> <span style="color: #a52a2a;">-&gt;</span> M<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Combine</span><span style="color: #6c6;">&#40;</span>left, right<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Concat</span><span style="color: #6c6;">&#40;</span>left, right<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">TryFinally</span><span style="color: #6c6;">&#40;</span>a <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a IObservable, f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">//</span>Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Finally</span><span style="color: #6c6;">&#40;</span>a, b<span style="color: #6c6;">&#41;</span> ??<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>a IObservable <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span><span style="color: #6c6;">&#40;</span>o<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span><span style="color: #6c6;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>a IObserver <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> x <span style="color: #a52a2a;">=</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> x<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnError</span> e <span style="color: #a52a2a;">=</span> f<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnError</span> e<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnCompleted</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> f<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnCompleted</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">TryWith</span><span style="color: #6c6;">&#40;</span>a <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a IObservable, f <span style="color: #a52a2a;">:</span> <span style="color: #06c; font-weight: bold;">Exception</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #a52a2a;">'</span>a IObservable<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Catch</span><span style="color: #6c6;">&#40;</span>a, Func<span style="color: #a52a2a;">&lt;</span>Exception, <span style="color: #a52a2a;">'</span>a IObservable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Using</span><span style="color: #6c6;">&#40;</span>a <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">#</span>IDisposable, f <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">#</span>IDisposable <span style="color: #a52a2a;">-&gt;</span> <span style="color: #a52a2a;">'</span>a IObservable<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">TryFinally</span><span style="color: #6c6;">&#40;</span>f a, <span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> a<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Zero</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Never</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> oseq <span style="color: #a52a2a;">=</span> ObservableBuilder<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp;<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> listen f <span style="color: #6c6;">&#40;</span>o <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a IObservable<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; o<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IObserver<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span> <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> a <span style="color: #a52a2a;">=</span> f a<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnCompleted</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnError</span> e <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">raise</span> e<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> zip a b <span style="color: #a52a2a;">=</span> oseq <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">for</span> a<span style="color: #a52a2a;">'</span> <span style="color: #06c; font-weight: bold;">in</span> a <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">for</span> b<span style="color: #a52a2a;">'</span> <span style="color: #06c; font-weight: bold;">in</span> b <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; return a<span style="color: #a52a2a;">'</span>, b<span style="color: #a52a2a;">'</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> <span style="color: #a52a2a;">.</span><span style="color: #060;">NET</span> events are wrapped <span style="color: #06c; font-weight: bold;">in</span> a generic IEvent object <span style="color: #06c; font-weight: bold;">with</span> two <span style="color: #06c; font-weight: bold;">type</span> arguments<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> the first is the delegate <span style="color: #06c; font-weight: bold;">type</span> <span style="color: #06c; font-weight: bold;">and</span> the second is the <span style="color: #06c; font-weight: bold;">type</span> <span style="color: #06c; font-weight: bold;">of</span> the event arguments<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> Use this overload <span style="color: #06c; font-weight: bold;">to</span> convert these events into IObservable<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> from_event <span style="color: #6c6;">&#40;</span>ev <span style="color: #a52a2a;">:</span> IEvent<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>b <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a> IObservable <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span> o <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> next <span style="color: #a52a2a;">=</span> Action<span style="color: #a52a2a;">&lt;</span>obj, <span style="color: #a52a2a;">'</span>b<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> source a <span style="color: #a52a2a;">-&gt;</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span><span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>b <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #6c6;">&#40;</span>source, a<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> senderParameter <span style="color: #a52a2a;">=</span> Expression<span style="color: #a52a2a;">.</span><span style="color: #060;">Parameter</span><span style="color: #6c6;">&#40;</span>typeof<span style="color: #a52a2a;">&lt;</span>obj<span style="color: #a52a2a;">&gt;</span>, <span style="color: #3cb371;">&quot;sender&quot;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> argumentsParameter <span style="color: #a52a2a;">=</span> Expression<span style="color: #a52a2a;">.</span><span style="color: #060;">Parameter</span><span style="color: #6c6;">&#40;</span>typeof<span style="color: #a52a2a;">&lt;'</span>b<span style="color: #a52a2a;">&gt;</span>, <span style="color: #3cb371;">&quot;arguments&quot;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> parameterArray <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">|</span> <span style="color: #6c6;">&#40;</span>senderParameter <span style="color: #a52a2a;">:&gt;</span> Expression<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> <span style="color: #6c6;">&#40;</span>argumentsParameter <span style="color: #a52a2a;">:&gt;</span> Expression<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> handlerExpression <span style="color: #a52a2a;">=</span> Expression<span style="color: #a52a2a;">.</span><span style="color: #060;">Lambda</span><span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>Expression<span style="color: #a52a2a;">.</span><span style="color: #060;">Call</span><span style="color: #6c6;">&#40;</span>Expression<span style="color: #a52a2a;">.</span><span style="color: #060;">Constant</span><span style="color: #6c6;">&#40;</span>next<span style="color: #a52a2a;">.</span><span style="color: #060;">Target</span><span style="color: #6c6;">&#41;</span>, next<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Method</span>, parameterArray<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">|</span> senderParameter<span style="color: #a52a2a;">;</span> argumentsParameter <span style="color: #a52a2a;">|</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> handler <span style="color: #a52a2a;">=</span> handlerExpression<span style="color: #a52a2a;">.</span><span style="color: #060;">Compile</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ev<span style="color: #a52a2a;">.</span><span style="color: #060;">AddHandler</span><span style="color: #6c6;">&#40;</span>handler<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IDisposable <span style="color: #06c; font-weight: bold;">with</span> member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> ev<span style="color: #a52a2a;">.</span><span style="color: #060;">RemoveHandler</span><span style="color: #6c6;">&#40;</span>handler<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> Native F<span style="color: #a52a2a;">#</span> events are <span style="color: #06c; font-weight: bold;">of</span> <span style="color: #06c; font-weight: bold;">type</span> IEvent but <span style="color: #06c; font-weight: bold;">with</span> only one <span style="color: #06c; font-weight: bold;">type</span> argument<span style="color: #a52a2a;">:</span> the <span style="color: #06c; font-weight: bold;">type</span> <span style="color: #06c; font-weight: bold;">of</span> the event arguments<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> This <span style="color: #06c; font-weight: bold;">method</span> converts native F<span style="color: #a52a2a;">#</span> events <span style="color: #06c; font-weight: bold;">to</span> IObservable<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> from_ievent<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>T<span style="color: #a52a2a;">&gt;</span> <span style="color: #6c6;">&#40;</span>event <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a IEvent<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IObservable<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span> <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span> o <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>event <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> e<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> handler <span style="color: #a52a2a;">=</span> Handler<span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> _ e <span style="color: #a52a2a;">-&gt;</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> e<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event<span style="color: #a52a2a;">.</span><span style="color: #060;">AddHandler</span> handler<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IDisposable <span style="color: #06c; font-weight: bold;">with</span> member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> event<span style="color: #a52a2a;">.</span><span style="color: #060;">RemoveHandler</span> handler <span style="color: #6c6;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> merge left right <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Merge</span><span style="color: #6c6;">&#40;</span>left, right<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> skip n o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Skip</span><span style="color: #6c6;">&#40;</span>o, n<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> pairwise o <span style="color: #a52a2a;">=</span> zip o <span style="color: #6c6;">&#40;</span>skip <span style="color: #c6c;">1</span> o<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> map f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Select</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> filter f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Where</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a, bool<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> until a b <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Until</span><span style="color: #6c6;">&#40;</span>b, a<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> waitUntil a b <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">WaitUntil</span><span style="color: #6c6;">&#40;</span>b, a<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> take n o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Take</span><span style="color: #6c6;">&#40;</span>o, n<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> takeWhile f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">TakeWhile</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a, bool<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> selectMany f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">SelectMany</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b IObservable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> holdUntilChanged o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">HoldUntilChanged</span> o<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> concat a b <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Concat</span><span style="color: #6c6;">&#40;</span>b, a<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> fold f s o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Aggregate</span><span style="color: #6c6;">&#40;</span>o, s, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b, <span style="color: #a52a2a;">'</span>a<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> reduce f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Aggregate</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>a, <span style="color: #a52a2a;">'</span>a<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> first <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">First</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> last <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Last</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> scan f s o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Scan</span><span style="color: #6c6;">&#40;</span>o, s, Func<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>a, <span style="color: #a52a2a;">'</span>a<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> skipWhile f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">SkipWhile</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a, bool<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> flatten <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Flatten</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> cons a o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Cons</span><span style="color: #6c6;">&#40;</span>a, o<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> range s c <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Range</span><span style="color: #6c6;">&#40;</span>s, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> interval i <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Interval</span><span style="color: #6c6;">&#40;</span>i<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> repeat <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Repeat</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">Let</span> f o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Let</span><span style="color: #6c6;">&#40;</span>o, Func<span style="color: #a52a2a;">&lt;'</span>a IObservable, <span style="color: #a52a2a;">'</span>b IObservable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> start f <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Start</span><span style="color: #6c6;">&#40;</span>Func<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> post context o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">Post</span><span style="color: #6c6;">&#40;</span>o, context<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> cast<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b<span style="color: #a52a2a;">&gt;</span> <span style="color: #6c6;">&#40;</span>e <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a IObservable<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> e <span style="color: #a52a2a;">|&gt;</span> map <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> evt <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span>evt <span style="color: #a52a2a;">:&gt;</span> obj<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> <span style="color: #a52a2a;">'</span>b<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> of_type<span style="color: #a52a2a;">&lt;'</span>a, <span style="color: #a52a2a;">'</span>b<span style="color: #a52a2a;">&gt;</span> e <span style="color: #a52a2a;">=</span> e <span style="color: #a52a2a;">|&gt;</span> cast<span style="color: #a52a2a;">&lt;'</span>a, obj<span style="color: #a52a2a;">&gt;</span> <span style="color: #a52a2a;">|&gt;</span> filter <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">function</span> <span style="color: #a52a2a;">:</span>? <span style="color: #a52a2a;">'</span>a <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">true</span> <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">false</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> cast<span style="color: #a52a2a;">&lt;</span>obj, <span style="color: #a52a2a;">'</span>b<span style="color: #a52a2a;">&gt;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> to_seq o <span style="color: #a52a2a;">=</span> Observable<span style="color: #a52a2a;">.</span><span style="color: #060;">ToEnumerable</span> o<br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> returns a <span style="color: #06c; font-weight: bold;">new</span> observer that fires <span style="color: #06c; font-weight: bold;">when</span> its state is <span style="color: #06c; font-weight: bold;">true</span><span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> the returned observer<span style="color: #a52a2a;">'</span>s state is managed by the <span style="color: #a52a2a;">'</span>start<span style="color: #a52a2a;">'</span> <span style="color: #06c; font-weight: bold;">and</span> <span style="color: #a52a2a;">'</span>stop<span style="color: #a52a2a;">'</span> argument observer<span style="color: #a52a2a;">'</span>s that, <span style="color: #06c; font-weight: bold;">when</span> fired, set the state <span style="color: #06c; font-weight: bold;">to</span> <span style="color: #06c; font-weight: bold;">true</span> <span style="color: #06c; font-weight: bold;">and</span> <span style="color: #06c; font-weight: bold;">false</span> respectivly<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> state start stop ob <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> set <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> <span style="color: #06c; font-weight: bold;">false</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> regstart <span style="color: #a52a2a;">=</span> start <span style="color: #a52a2a;">|&gt;</span> listen <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span> set <span style="color: #a52a2a;">:=</span> <span style="color: #06c; font-weight: bold;">true</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> regstop <span style="color: #a52a2a;">=</span> stop <span style="color: #a52a2a;">|&gt;</span> listen <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span> set <span style="color: #a52a2a;">:=</span> <span style="color: #06c; font-weight: bold;">false</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>a IObservable <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span> o <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> regob <span style="color: #a52a2a;">=</span> ob <span style="color: #a52a2a;">|&gt;</span> listen <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="color: #a52a2a;">!</span>set <span style="color: #06c; font-weight: bold;">then</span> o<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> x<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IDisposable <span style="color: #06c; font-weight: bold;">with</span> member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> regstart<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> regstop<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> regob<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> to_async <span style="color: #6c6;">&#40;</span>x <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a IObservable<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; Async<span style="color: #a52a2a;">.</span><span style="color: #060;">Primitive</span><span style="color: #6c6;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>answer, exn, exccancel<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> answers <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>a IObserver <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> x <span style="color: #a52a2a;">=</span> answers<span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span> x<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnCompleted</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> answer answers<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnError</span> ex <span style="color: #a52a2a;">=</span> exn ex<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#125;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a> <span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> from_async asynchronous <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> <span style="color: #a52a2a;">'</span>a IObservable <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Subscribe</span><span style="color: #6c6;">&#40;</span>observer<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> update <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> <span style="color: #06c; font-weight: bold;">true</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; async <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span><span style="color: #a52a2a;">!</span> value <span style="color: #a52a2a;">=</span> asynchronous<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> <span style="color: #a52a2a;">!</span>update <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;observer<span style="color: #a52a2a;">.</span><span style="color: #060;">OnNext</span> value<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;observer<span style="color: #a52a2a;">.</span><span style="color: #060;">OnCompleted</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">with</span> <span style="color: #a52a2a;">|</span> e <span style="color: #a52a2a;">-&gt;</span> observer<span style="color: #a52a2a;">.</span><span style="color: #060;">OnError</span> e<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span> <span style="color: #a52a2a;">|&gt;</span> Async<span style="color: #a52a2a;">.</span><span style="color: #060;">Start</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IDisposable <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Dispose</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update <span style="color: #a52a2a;">:=</span> <span style="color: #06c; font-weight: bold;">false</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<br />
<span style="color: #a52a2a;">//</span>________________________________________________________________________________________________________<br />
<span style="color: #06c; font-weight: bold;">module</span> Seq <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> to_oseq <span style="color: #6c6;">&#40;</span>x <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a seq<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> x<span style="color: #a52a2a;">.</span><span style="color: #060;">ToObservable</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> oseq <span style="color: #a52a2a;">=</span> OSeq<span style="color: #a52a2a;">.</span><span style="color: #060;">oseq</span><br />
&nbsp;</div>]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=107</comments>
 <pubDate>Sat, 22 Aug 2009 19:29:00 +0000</pubDate>
</item><item>
 <title>3d transfomations</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=103</link>
<description><![CDATA[here is the beginnings of a 3D transformation engine.<br />
I thought that it utilized a few impressive features of f# namely: matrix operations, active patterns, and first class events.<br />
the matrix class is defined in FSharp.PowerPack.dll<br />
<br />
you can controll the camera and viewer thusley (mouse movements are relative):<br />
hold down 'z' and left mouse button and move mouse to change camera z position.<br />
hold down 'x' and left mouse button and move mouse to change camera x and y position.<br />
use the same commands as above but with the right mouse button to controll viewer position.<br />
hold down 'r' and left mouse button and move mouse to change camera rotation in x/y-axis.<br />
hold down 'r' and right mouse button and move mouse to change camera rotation in z-axis.<br />
<br />
for display, it uses the SdlSimple library i wrote and which you can find a link to download <a href="http://blog.turbofriendship.com/index.php?itemid=12">here</a>.<br />
<br />
<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<br />
<span style="color: #a52a2a;">//</span>active pattern <span style="color: #06c; font-weight: bold;">to</span> catch return values from a matrix transformation<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">|</span>Matrix<span style="color: #a52a2a;">|</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>m <span style="color: #a52a2a;">:</span> matrix<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> getrows column <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span><span style="color: #060;">m</span><span style="color: #a52a2a;">.</span><span style="color: #060;">NumCols</span> <span style="color: #a52a2a;">-</span> <span style="color: #c6c;">1</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> row <span style="color: #a52a2a;">-&gt;</span> m<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span>column, row<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span><span style="color: #060;">m</span><span style="color: #a52a2a;">.</span><span style="color: #060;">NumRows</span> <span style="color: #a52a2a;">-</span> <span style="color: #c6c;">1</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> col <span style="color: #a52a2a;">-&gt;</span> getrows col<span style="color: #6c6;">&#41;</span> <br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>viewerx, viewery, viewerz<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">25.0</span>, <span style="color: #c6c;">25.0</span>, <span style="color: #a52a2a;">-</span><span style="color: #c6c;">150.0</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>viewer location<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>rotationx, rotationy, rotationz<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>cammera rotation<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>camerax, cameray, cameraz<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span>, <span style="color: #a52a2a;">-</span><span style="color: #c6c;">100.0</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>cammera location<br />
<br />
<span style="color: #a52a2a;">//</span>transform a 3d point into 2d space<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> transform <span style="color: #6c6;">&#40;</span>pointx, pointy, pointz<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span>Matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span>dx<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span>dy<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span>dz<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">=</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span><span style="color: #c6c;">1.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span>cos <span style="color: #a52a2a;">-</span>rotationx<span style="color: #a52a2a;">;</span>sin <span style="color: #a52a2a;">-</span>rotationx<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;-</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALsin"><span style="color: #06c; font-weight: bold;">sin</span></a> <span style="color: #a52a2a;">-</span>rotationx<span style="color: #a52a2a;">;</span>cos <span style="color: #a52a2a;">-</span>rotationx<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">*</span><br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALcos"><span style="color: #06c; font-weight: bold;">cos</span></a> <span style="color: #a52a2a;">-</span>rotationy<span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;-</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALsin"><span style="color: #06c; font-weight: bold;">sin</span></a> <span style="color: #a52a2a;">-</span>rotationy<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">1.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALsin"><span style="color: #06c; font-weight: bold;">sin</span></a> <span style="color: #a52a2a;">-</span>rotationy<span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span>cos <span style="color: #a52a2a;">-</span>rotationy<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">*</span><br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALcos"><span style="color: #06c; font-weight: bold;">cos</span></a> <span style="color: #a52a2a;">-</span>rotationz<span style="color: #a52a2a;">;</span>sin <span style="color: #a52a2a;">-</span>rotationz<span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">-</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALsin"><span style="color: #06c; font-weight: bold;">sin</span></a> <span style="color: #a52a2a;">-</span>rotationz<span style="color: #a52a2a;">;</span>cos <span style="color: #a52a2a;">-</span>rotationz<span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">1.0</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">*</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span>pointx<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>pointy<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>pointz<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">-</span><br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span>camerax<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>cameray<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>cameraz<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#41;</span> <br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span>Matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span>fx<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span>fy<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span>fz<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span>fw<span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span><span style="color: #c6c;">1.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;-</span>viewerx<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">1.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;-</span>viewery<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">1.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">1.0</span> <span style="color: #a52a2a;">/</span> viewerz<span style="color: #a52a2a;">;</span><span style="color: #c6c;">0.0</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">*</span><br />
&nbsp; &nbsp; &nbsp; matrix <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#91;</span>dx<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>dy<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>dz<span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #c6c;">1.0</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#93;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #6c6;">&#40;</span>fx <span style="color: #a52a2a;">/</span> fw <span style="color: #a52a2a;">|&gt;</span> int, fy <span style="color: #a52a2a;">/</span> fw <span style="color: #a52a2a;">|&gt;</span> int<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">type</span> shape <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#123;</span> vectors <span style="color: #a52a2a;">:</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a> <span style="color: #a52a2a;">*</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a> <span style="color: #a52a2a;">*</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#41;</span> list<span style="color: #a52a2a;">;</span> lines <span style="color: #a52a2a;">:</span> <span style="color: #6c6;">&#40;</span>int <span style="color: #a52a2a;">*</span> int<span style="color: #6c6;">&#41;</span> list <span style="color: #6c6;">&#125;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> cube <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;vectors <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">50.0</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">50.0</span><span style="color: #a52a2a;">;</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">50.0</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #c6c;">50.0</span>, <span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">50.0</span><span style="color: #6c6;">&#93;</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp;lines <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #c6c;">0</span>,<span style="color: #c6c;">1</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">1</span>,<span style="color: #c6c;">2</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">2</span>,<span style="color: #c6c;">3</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">3</span>,<span style="color: #c6c;">0</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">4</span>,<span style="color: #c6c;">5</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">5</span>,<span style="color: #c6c;">6</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">6</span>,<span style="color: #c6c;">7</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">7</span>,<span style="color: #c6c;">4</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">0</span>,<span style="color: #c6c;">4</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">1</span>,<span style="color: #c6c;">5</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">2</span>,<span style="color: #c6c;">6</span><span style="color: #a52a2a;">;</span> <span style="color: #c6c;">3</span>,<span style="color: #c6c;">7</span><span style="color: #6c6;">&#93;</span> <br />
<span style="color: #6c6;">&#125;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> offsetcube <span style="color: #a52a2a;">=</span> cube<br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">open</span> System<br />
<span style="color: #06c; font-weight: bold;">open</span> Seq<br />
<span style="color: #06c; font-weight: bold;">open</span> SdlSimple<br />
SdlSimpleSetup <span style="color: #c6c;">500</span> <span style="color: #c6c;">550</span> <span style="color: #c6c;">16</span> <span style="color: #06c; font-weight: bold;">false</span><br />
cls <span style="color: #3cb371;">&quot;fps&quot;</span><br />
<br />
<span style="color: #a52a2a;">//</span>debug information<span style="color: #a52a2a;">:</span><br />
draw <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;viewer:&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">400</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;x&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">410</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey viewerx <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">410</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;y&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">420</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey viewery <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">420</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;z&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">430</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey viewerz <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">430</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;camera:&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">450</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;x&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">460</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey camerax <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">460</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;y&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">470</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey cameray <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">470</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;z&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">480</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey cameraz <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">480</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;rotation:&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">500</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;x&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">510</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey rotationx <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">510</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;y&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">520</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey rotationy <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">520</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;z&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">400</span>, <span style="color: #c6c;">530</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> writey rotationz <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">420</span>, <span style="color: #c6c;">530</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#125;</span><br />
<br />
<span style="color: #a52a2a;">//</span>draw cube<span style="color: #a52a2a;">:</span><br />
draw <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> redpixel <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> pixel <span style="color: #6c6;">&#40;</span>colour <span style="color: #c6c;">255</span> <span style="color: #c6c;">0</span> <span style="color: #c6c;">0</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">250</span>, y <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">275</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> whiteline <span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> line <span style="color: #6c6;">&#40;</span>colour <span style="color: #c6c;">255</span> <span style="color: #c6c;">255</span> <span style="color: #c6c;">255</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x1 <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">250</span>, y1 <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">275</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x2 <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">250</span>, y2 <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">275</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> points <span style="color: #a52a2a;">=</span> offsetcube<span style="color: #a52a2a;">.</span><span style="color: #060;">vectors</span> <span style="color: #a52a2a;">|&gt;</span> map transform <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">to_array</span><br />
&nbsp; &nbsp;offsetcube<span style="color: #a52a2a;">.</span><span style="color: #060;">lines</span> <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">iter</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>l,r<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> whiteline points<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span>l<span style="color: #6c6;">&#93;</span> points<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span>r<span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;points <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">iter</span> redpixel<br />
<span style="color: #6c6;">&#125;</span><br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">open</span> EventExtensions<br />
<br />
<span style="color: #a52a2a;">//</span>camera <span style="color: #06c; font-weight: bold;">and</span> viewer movements<span style="color: #a52a2a;">:</span><br />
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">mousemove</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">pairwise</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">leftdown</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">leftup</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">stateofkey</span> <span style="color: #c6c;">120</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; camerax <span style="color: #a52a2a;">&lt;-</span> camerax <span style="color: #a52a2a;">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>x2 <span style="color: #a52a2a;">-</span> x1<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> cameray <span style="color: #a52a2a;">&lt;-</span> cameray <span style="color: #a52a2a;">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>y2 <span style="color: #a52a2a;">-</span> y1<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">mousemove</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">pairwise</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">leftdown</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">leftup</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">stateofkey</span> <span style="color: #c6c;">122</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; cameraz <span style="color: #a52a2a;">&lt;-</span> cameraz <span style="color: #a52a2a;">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>y2 <span style="color: #a52a2a;">-</span> y1<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">/</span> <span style="color: #c6c;">2.0</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">mousemove</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">pairwise</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">rightdown</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">rightup</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">stateofkey</span> <span style="color: #c6c;">120</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; viewerx <span style="color: #a52a2a;">&lt;-</span> viewerx <span style="color: #a52a2a;">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>x2 <span style="color: #a52a2a;">-</span> x1<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> viewery <span style="color: #a52a2a;">&lt;-</span> viewery <span style="color: #a52a2a;">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>y2 <span style="color: #a52a2a;">-</span> y1<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">mousemove</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">pairwise</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">rightdown</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">rightup</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">stateofkey</span> <span style="color: #c6c;">122</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; viewerz <span style="color: #a52a2a;">&lt;-</span> viewerz <span style="color: #a52a2a;">-</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>y2 <span style="color: #a52a2a;">-</span> y1<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">/</span> <span style="color: #c6c;">2.0</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">mousemove</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">pairwise</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">leftdown</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">leftup</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">stateofkey</span> <span style="color: #c6c;">114</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; rotationy <span style="color: #a52a2a;">&lt;-</span> rotationy <span style="color: #a52a2a;">-</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>x2 <span style="color: #a52a2a;">-</span> x1<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">*</span> <span style="color: #c6c;">0.01</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> rotationx <span style="color: #a52a2a;">&lt;-</span> rotationx <span style="color: #a52a2a;">+</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>y2 <span style="color: #a52a2a;">-</span> y1<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">*</span> <span style="color: #c6c;">0.01</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">mousemove</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">pairwise</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">rightdown</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">rightup</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">stateofkey</span> <span style="color: #c6c;">114</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; rotationz <span style="color: #a52a2a;">&lt;-</span> rotationz <span style="color: #a52a2a;">+</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#40;</span>y2 <span style="color: #a52a2a;">-</span> y1<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">*</span> <span style="color: #c6c;">0.02</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span> &nbsp; <br />
&nbsp; &nbsp;<br />
Console<span style="color: #a52a2a;">.</span><span style="color: #060;">ReadLine</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><br />
&nbsp;</div><br />
<br />
<h1>EventExtensions.fs</h1><br />
this program uses some extensions to the Event class (EventExtensions.fs) that i have made.<br />
these include refining of SdlSimple events and the 'state' event combinator.<br />
<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<span style="color: #06c; font-weight: bold;">open</span> SdlSimple<br />
<span style="color: #06c; font-weight: bold;">open</span> System<br />
<br />
<span style="color: #06c; font-weight: bold;">module</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> returns a <span style="color: #06c; font-weight: bold;">new</span> event that fires <span style="color: #06c; font-weight: bold;">when</span> its state is <span style="color: #06c; font-weight: bold;">true</span><span style="color: #a52a2a;">.</span> &nbsp;<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> the returned event<span style="color: #a52a2a;">'</span>s state is managed by the <span style="color: #a52a2a;">'</span>a <span style="color: #06c; font-weight: bold;">and</span> <span style="color: #a52a2a;">'</span>b argument events that, <span style="color: #06c; font-weight: bold;">when</span> fired, set the state <span style="color: #06c; font-weight: bold;">to</span> <span style="color: #06c; font-weight: bold;">true</span> <span style="color: #06c; font-weight: bold;">and</span> <span style="color: #06c; font-weight: bold;">false</span> respectivly<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> state <span style="color: #6c6;">&#40;</span>start <span style="color: #a52a2a;">:</span> IEvent<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>stop <span style="color: #a52a2a;">:</span> IEvent<span style="color: #a52a2a;">&lt;'</span>b<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>e <span style="color: #a52a2a;">:</span> IEvent<span style="color: #a52a2a;">&lt;'</span>T<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> set <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> <span style="color: #06c; font-weight: bold;">false</span><br />
&nbsp; &nbsp; &nbsp; start<span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span> set <span style="color: #a52a2a;">:=</span> <span style="color: #06c; font-weight: bold;">true</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; stop<span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span> &nbsp;<span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span> set <span style="color: #a52a2a;">:=</span> <span style="color: #06c; font-weight: bold;">false</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#123;</span><span style="color: #06c; font-weight: bold;">new</span> IEvent<span style="color: #a52a2a;">&lt;'</span>T<span style="color: #a52a2a;">&gt;</span> <span style="color: #06c; font-weight: bold;">with</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> e<span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="color: #a52a2a;">!</span>set <span style="color: #06c; font-weight: bold;">then</span> f x<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">//</span>this is <span style="color: #06c; font-weight: bold;">not</span> a proper implementation <span style="color: #06c; font-weight: bold;">for</span> AddHandler <span style="color: #06c; font-weight: bold;">and</span> RemoveHandler<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">AddHandler</span><span style="color: #6c6;">&#40;</span>h<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">RemoveHandler</span><span style="color: #6c6;">&#40;</span>h<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> returns an IEvent that fires <span style="color: #06c; font-weight: bold;">when</span> the specified key is pressed<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> keypress key <span style="color: #a52a2a;">=</span> events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>KeyDown key<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>KeyDown key<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> returns an IEvent that fires <span style="color: #06c; font-weight: bold;">when</span> the specified key is released<span style="color: #a52a2a;">.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> keyrelease key <span style="color: #a52a2a;">=</span> events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>KeyUp key<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>KeyUp key<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> return an <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">state</span> <span style="color: #06c; font-weight: bold;">function</span> whos state is altered by the press <span style="color: #06c; font-weight: bold;">and</span> release <span style="color: #06c; font-weight: bold;">of</span> the argument <span style="color: #a52a2a;">'</span>key<span style="color: #a52a2a;">'.</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> stateofkey key <span style="color: #a52a2a;">=</span> state <span style="color: #6c6;">&#40;</span>keypress key<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>keyrelease key<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> returns an IEvent that fires <span style="color: #06c; font-weight: bold;">when</span> the mouse is moved<span style="color: #a52a2a;">.</span> &nbsp;<span style="color: #060;">returns</span> mouse co<span style="color: #a52a2a;">-</span>ordinates<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> mousemove <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; events <br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">function</span> MouseMove<span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">true</span> <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">false</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>MouseMove<span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> x, y<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> fires on a left mouse button down event<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> leftdown <span style="color: #a52a2a;">=</span> events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>MouseDown<span style="color: #6c6;">&#40;</span><span style="color: #c6c;">1</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> fires on a left mouse button up event<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> leftup <span style="color: #a52a2a;">=</span> events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>MouseUp<span style="color: #6c6;">&#40;</span><span style="color: #c6c;">1</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> fires on a right mouse button down event<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> rightdown <span style="color: #a52a2a;">=</span> events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>MouseDown<span style="color: #6c6;">&#40;</span><span style="color: #c6c;">3</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">///</span> fires on a right mouse button up event<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> rightup <span style="color: #a52a2a;">=</span> events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>MouseUp<span style="color: #6c6;">&#40;</span><span style="color: #c6c;">3</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp;</div><br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=103</comments>
 <pubDate>Sun, 21 Jun 2009 20:28:26 +0000</pubDate>
</item><item>
 <title>quicksort implementation comparisons</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=98</link>
<description><![CDATA[i set out to compare the relative speeds of some slightly different versions of quicksort for lists.<br />
i think the results are worth noting.<br />
<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> qsort_else f lst <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">if</span> lst <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">else</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> pivot <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">hd</span> lst<br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> left <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">tl</span> lst <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span>f pivot<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> qsort_else f<br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> right <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">tl</span> lst <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span>f pivot <span style="color: #a52a2a;">&gt;&gt;</span> <span style="color: #06c; font-weight: bold;">not</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> qsort_else f<br />
&nbsp; &nbsp; &nbsp; left @ <span style="color: #6c6;">&#91;</span>pivot<span style="color: #6c6;">&#93;</span> @ right<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> qsort_append f <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> head <span style="color: #a52a2a;">::</span> tail <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#40;</span>tail <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span>f head<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> qsort_append f<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;@ <span style="color: #6c6;">&#91;</span>head<span style="color: #6c6;">&#93;</span> @<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#40;</span>tail <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span>f head <span style="color: #a52a2a;">&gt;&gt;</span> <span style="color: #06c; font-weight: bold;">not</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> qsort_append f<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> qsort_pipe f <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> head <span style="color: #a52a2a;">::</span> tail <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; tail <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">partition</span> <span style="color: #6c6;">&#40;</span>f head<span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> qsort_pipe f x, qsort_pipe f y<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>left, right<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> left @ <span style="color: #6c6;">&#91;</span>head<span style="color: #6c6;">&#93;</span> @ right<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> qsort_CPS f lst &nbsp;<span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> sort l clst r c <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> clst <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> c <span style="color: #6c6;">&#40;</span>l @ <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> @ r<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> a <span style="color: #a52a2a;">::</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> c <span style="color: #6c6;">&#40;</span>l @ <span style="color: #6c6;">&#91;</span>a<span style="color: #6c6;">&#93;</span> @ r<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> pivot <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">hd</span> clst<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> left <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">tl</span> clst <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span>f pivot<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> right <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">tl</span> clst <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span>f pivot <span style="color: #a52a2a;">&gt;&gt;</span> <span style="color: #06c; font-weight: bold;">not</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sort l left <span style="color: #6c6;">&#91;</span>pivot<span style="color: #6c6;">&#93;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> sort x right r c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;sort <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> lst <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> x<span style="color: #6c6;">&#41;</span><br />
&nbsp;</div><br />
i also compared these four versions with the default List.sort and the mergesort which i copied out of local.fs from the f# source (search for stable_sort).<br />
<br />
i only tested one kind of input data: a large, unsorted list comprised of random integer data in the same range as the length of the list.  specifically generated this way:<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">let</span> _random <span style="color: #a52a2a;">=</span> System<span style="color: #a52a2a;">.</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Random.html"><span style="color: #06c; font-weight: bold;">Random</span></a><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> rand<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> _random<span style="color: #a52a2a;">.</span><span style="color: #060;">Next</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> num <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">200000</span><br />
<span style="color: #06c; font-weight: bold;">let</span> unsorted <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span>1<span style="color: #a52a2a;">..</span><span style="color: #060;">num</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> _ <span style="color: #a52a2a;">-&gt;</span> rand<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">%</span> num<span style="color: #6c6;">&#41;</span></div><br />
i ran each sorting method on the same unsorted list five times and averaged the result in milliseconds.<br />
<br />
these are the results using version 1.9.6.2 of the f# compiler:<br />
<font color="yellow">List.sort: 500, 457, 525, 468, 468,  --> average: 483.600000<br />
merge sort: 510, 482, 463, 542, 467,  --> average: 492.800000<br />
qsort_else: 942, 917, 944, 968, 953,  --> average: 944.800000<br />
qsort_append: 888, 836, 854, 890, 807,  --> average: 855.000000<br />
qsort_pipe: 672, 727, 751, 788, 669,  --> average: 721.400000<br />
qsort_CPS:</font><br />
<br />
<br />
<h1>conclusions:</h1><br />
+the continuation passing style version of quicksort overflows the stack before it returns any meaningful data.  if given a much smaller dataset it is still at least 100 times slower than the other sorting methods.<br />
<br />
+pattern matching on a list appears to be slightly faster than an if/then/else case that does the same thing.<br />
<br />
+the fastest quicksort method pipes the list through List.partition instead of filtering twice.<br />
<br />
+an optimized mergesort is faster than any of my quicksort implementations and this is the method that List.sort uses internally i believe.<br />
<br />
<br />
the most interesting information though, came when i ran the same tests on the most recently released version of f#<br />
<br />
these are the results compiled using f# 1.9.6.16:<br />
<font color="yellow">List.sort: 1507, 1405, 1408, 1450, 1339,  --> average: 1421.800000<br />
merge sort: 834, 768, 741, 723, 706,  --> average: 754.400000<br />
qsort_else: 1125, 1104, 1051, 1099, 1013,  --> average: 1078.400000<br />
qsort_append: 1033, 946, 1000, 1073, 978,  --> average: 1006.000000<br />
qsort_pipe: 836, 860, 833, 748, 795,  --> average: 814.400000<br />
qsort_CPS:</font><br />
<br />
+it is worth noting that ALL times are slightly slower but what is quite striking is:<br />
<br />
+the native List.sort method is now almost twice as slow as my fastest quicksort method and three times slower than in the previous version of the compiler.<br />
<br />
+since mergesort is still the fastest method (although about 60% slower than the 1.9.6.2 compiled version) and List.sort is operating so sluggishly it would lead me to believe that List.sort in the newest f# compiler no longer uses the mergesort method in local.fs.<br />
<br />
what method does it use?<br />
<br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=98</comments>
 <pubDate>Thu, 28 May 2009 18:58:13 +0000</pubDate>
</item><item>
 <title>custom function series using wpf charting toolkit</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=94</link>
<description><![CDATA[the wpf build of the silverlight charting toolkit has recently been released: <a href="http://blogs.msdn.com/delay/archive/2009/03/26/if-they-can-build-it-they-will-come-enabling-anyone-to-compile-wpf-charting-from-the-silverlight-charting-sources.aspx"><br />
Delay's Blog</a><br />
<br />
using jafar husain's excellent tutorial on creating a custom chart series:<a href="http://themechanicalbride.blogspot.com/2009/03/writing-your-own-silverlight-chart.html"><br />
Writing Your Own Silverlight Chart Series (Part 1): Making Designers Happy<br />
</a>and<a href="http://themechanicalbride.blogspot.com/2009_03_01_archive.html"><br />
Writing Your Own Silverlight Chart Series (Part 2): Implementing the Series<br />
</a><br />
i was able to create a function series in f#:<br />
<br />
<img src="media/squarewave.png" /><center><div class="ocaml"><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#91;</span>3<span style="color: #a52a2a;">.</span>0<span style="color: #a52a2a;">..</span>2<span style="color: #a52a2a;">.</span>0<span style="color: #a52a2a;">..</span>49<span style="color: #a52a2a;">.</span>0<span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">fold</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> a b <span style="color: #a52a2a;">-&gt;</span> a <span style="color: #a52a2a;">+</span> Math<span style="color: #a52a2a;">.</span><span style="color: #060;">Sin</span><span style="color: #6c6;">&#40;</span>b <span style="color: #a52a2a;">*</span> x<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">/</span> b<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>Math<span style="color: #a52a2a;">.</span><span style="color: #060;">Sin</span> x<span style="color: #6c6;">&#41;</span></div></center><br />
<br />
<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<br />
namespace Charts<br />
<br />
<span style="color: #06c; font-weight: bold;">open</span> System<br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Media</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Markup</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Shapes</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Controls</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Controls</span><span style="color: #a52a2a;">.</span><span style="color: #060;">DataVisualization</span><br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Windows</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Controls</span><span style="color: #a52a2a;">.</span><span style="color: #060;">DataVisualization</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Charting</span><br />
<br />
<span style="color: #06c; font-weight: bold;">module</span> Seq <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> of_type<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span> <span style="color: #6c6;">&#40;</span>s <span style="color: #a52a2a;">:</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Collections</span><span style="color: #a52a2a;">.</span><span style="color: #060;">IEnumerable</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; seq <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">for</span> item <span style="color: #06c; font-weight: bold;">in</span> s <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> item <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? <span style="color: #a52a2a;">'</span>a <span style="color: #06c; font-weight: bold;">as</span> item <span style="color: #a52a2a;">-&gt;</span> yield item<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span> &nbsp; <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> range <span style="color: #6c6;">&#40;</span>s <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a seq<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">isEmpty</span> s <span style="color: #06c; font-weight: bold;">then</span> None <span style="color: #06c; font-weight: bold;">else</span> <br />
&nbsp; &nbsp; &nbsp; s <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">fold</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span> a <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a> <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">if</span> a <span style="color: #a52a2a;">&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a> <span style="color: #06c; font-weight: bold;">then</span> a <span style="color: #06c; font-weight: bold;">else</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a> <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">if</span> a <span style="color: #a52a2a;">&lt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a> <span style="color: #06c; font-weight: bold;">then</span> a <span style="color: #06c; font-weight: bold;">else</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">hd</span> s, Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">hd</span> s<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> Some<br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">|</span>Range<span style="color: #a52a2a;">|</span>_<span style="color: #a52a2a;">|</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>range <span style="color: #a52a2a;">:</span> <span style="color: #a52a2a;">'</span>a Range<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> range<span style="color: #a52a2a;">.</span><span style="color: #060;">HasData</span> <span style="color: #06c; font-weight: bold;">then</span> Range <span style="color: #6c6;">&#40;</span>range<span style="color: #a52a2a;">.</span><span style="color: #060;">Minimum</span>, range<span style="color: #a52a2a;">.</span><span style="color: #060;">Maximum</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> Some <span style="color: #06c; font-weight: bold;">else</span> None<br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">type</span> public FunctionSeries<span style="color: #6c6;">&#40;</span>?fx <span style="color: #a52a2a;">:</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a> <span style="color: #a52a2a;">-&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALfloat"><span style="color: #06c; font-weight: bold;">float</span></a><span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">as</span> this <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">inherit</span> Series<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DefaultValue<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp;static <span style="color: #06c; font-weight: bold;">val</span> <span style="color: #06c; font-weight: bold;">mutable</span> public PointsProperty <span style="color: #a52a2a;">:</span> DependencyProperty<br />
&nbsp; &nbsp;static <span style="color: #06c; font-weight: bold;">do</span> FunctionSeries<span style="color: #a52a2a;">.</span><span style="color: #060;">PointsProperty</span> <span style="color: #a52a2a;">&lt;-</span> DependencyProperty<span style="color: #a52a2a;">.</span><span style="color: #060;">Register</span><span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;Points&quot;</span>, typeof<span style="color: #a52a2a;">&lt;</span>PointCollection<span style="color: #a52a2a;">&gt;</span>, typeof<span style="color: #a52a2a;">&lt;</span>FunctionSeries<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> itemSource <span style="color: #a52a2a;">:</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Collections</span><span style="color: #a52a2a;">.</span><span style="color: #060;">IEnumerable</span> <span style="color: #a52a2a;">=</span> null<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> plotArea <span style="color: #a52a2a;">:</span> Canvas <span style="color: #a52a2a;">=</span> null<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>xaxis <span style="color: #a52a2a;">:</span> IAxis<span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>yaxis <span style="color: #a52a2a;">:</span> IRangeAxis<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> null, null<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> range <span style="color: #a52a2a;">=</span> Range<span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">-</span><span style="color: #c6c;">1.0</span>, <span style="color: #c6c;">1.0</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> f <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> x<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> calculateItems <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> detail <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">600.0</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> range <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">Range</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">.</span>0<span style="color: #a52a2a;">..</span><span style="color: #060;">detail</span><span style="color: #6c6;">&#93;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> x <span style="color: #a52a2a;">*</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a> <span style="color: #a52a2a;">-</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">/</span> detail<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">+</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a><span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> Point<span style="color: #6c6;">&#40;</span>x, f x<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">empty</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">do</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> fx <span style="color: #06c; font-weight: bold;">with</span> <span style="color: #a52a2a;">|</span> Some fx <span style="color: #a52a2a;">-&gt;</span> f <span style="color: #a52a2a;">&lt;-</span> fx <span style="color: #a52a2a;">|</span> None <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; itemSource <span style="color: #a52a2a;">&lt;-</span> calculateItems<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">do</span> <br />
&nbsp; &nbsp; &nbsp; use stream <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>Application<span style="color: #a52a2a;">.</span><span style="color: #060;">GetResourceStream</span><span style="color: #6c6;">&#40;</span>Uri<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;FunctionSeries.xaml&quot;</span>, UriKind<span style="color: #a52a2a;">.</span><span style="color: #060;">RelativeOrAbsolute</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Stream.html"><span style="color: #06c; font-weight: bold;">Stream</span></a><br />
&nbsp; &nbsp; &nbsp; this<span style="color: #a52a2a;">.</span><span style="color: #060;">Style</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #6c6;">&#40;</span>XamlReader<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Load</span><span style="color: #6c6;">&#40;</span>stream<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> Style<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;override this<span style="color: #a52a2a;">.</span><span style="color: #060;">Refresh</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> xaxis <span style="color: #a52a2a;">&lt;&gt;</span> null <span style="color: #a52a2a;">&amp;&amp;</span> yaxis <span style="color: #a52a2a;">&lt;&gt;</span> null <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this<span style="color: #a52a2a;">.</span><span style="color: #060;">Points</span> <span style="color: #a52a2a;">&lt;-</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemSource <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">of_type</span><span style="color: #a52a2a;">&lt;</span>Point<span style="color: #a52a2a;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> p <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> x <span style="color: #a52a2a;">=</span> xaxis<span style="color: #a52a2a;">.</span><span style="color: #060;">GetPlotAreaCoordinate</span><span style="color: #6c6;">&#40;</span>p<span style="color: #a52a2a;">.</span><span style="color: #060;">X</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Value</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Value</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> y <span style="color: #a52a2a;">=</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">ActualHeight</span> <span style="color: #a52a2a;">-</span> yaxis<span style="color: #a52a2a;">.</span><span style="color: #060;">GetPlotAreaCoordinate</span><span style="color: #6c6;">&#40;</span>p<span style="color: #a52a2a;">.</span><span style="color: #060;">Y</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Value</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Value</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Point<span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">sortBy</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> p <span style="color: #a52a2a;">-&gt;</span> p<span style="color: #a52a2a;">.</span><span style="color: #060;">X</span><span style="color: #6c6;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> s <span style="color: #a52a2a;">-&gt;</span> PointCollection s<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">else</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;override this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnApplyTemplate</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; plotArea <span style="color: #a52a2a;">&lt;-</span> <span style="color: #6c6;">&#40;</span>this<span style="color: #a52a2a;">.</span><span style="color: #060;">GetTemplateChild</span><span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;canvas&quot;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> Canvas<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; this<span style="color: #a52a2a;">.</span><span style="color: #060;">Refresh</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;override this<span style="color: #a52a2a;">.</span><span style="color: #060;">OnSeriesHostPropertyChanged</span><span style="color: #6c6;">&#40;</span>o, n<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> points <span style="color: #a52a2a;">=</span> itemSource <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">of_type</span><span style="color: #a52a2a;">&lt;</span>Point<span style="color: #a52a2a;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> n <span style="color: #a52a2a;">&lt;&gt;</span> null <span style="color: #a52a2a;">&amp;&amp;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">isEmpty</span> points <span style="color: #a52a2a;">|&gt;</span> <span style="color: #06c; font-weight: bold;">not</span> <span style="color: #06c; font-weight: bold;">then</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> first <span style="color: #a52a2a;">=</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">nth</span> <span style="color: #c6c;">0</span> points<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xaxis <span style="color: #a52a2a;">&lt;-</span> n<span style="color: #a52a2a;">.</span><span style="color: #060;">Axes</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> a <span style="color: #a52a2a;">-&gt;</span> a<span style="color: #a52a2a;">.</span><span style="color: #060;">CanPlot</span><span style="color: #6c6;">&#40;</span>first<span style="color: #a52a2a;">.</span><span style="color: #060;">X</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">&amp;&amp;</span> a<span style="color: #a52a2a;">.</span><span style="color: #060;">Orientation</span> <span style="color: #a52a2a;">=</span> AxisOrientation<span style="color: #a52a2a;">.</span><span style="color: #060;">X</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">nth</span> <span style="color: #c6c;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yaxis <span style="color: #a52a2a;">&lt;-</span> n<span style="color: #a52a2a;">.</span><span style="color: #060;">Axes</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">of_type</span><span style="color: #a52a2a;">&lt;</span>IRangeAxis<span style="color: #a52a2a;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> a <span style="color: #a52a2a;">-&gt;</span> a<span style="color: #a52a2a;">.</span><span style="color: #060;">CanPlot</span><span style="color: #6c6;">&#40;</span>first<span style="color: #a52a2a;">.</span><span style="color: #060;">Y</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">&amp;&amp;</span> a<span style="color: #a52a2a;">.</span><span style="color: #060;">Orientation</span> <span style="color: #a52a2a;">=</span> AxisOrientation<span style="color: #a52a2a;">.</span><span style="color: #060;">Y</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">nth</span> <span style="color: #c6c;">0</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xaxis<span style="color: #a52a2a;">.</span><span style="color: #060;">RegisteredListeners</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span><span style="color: #6c6;">&#40;</span>this<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yaxis<span style="color: #a52a2a;">.</span><span style="color: #060;">RegisteredListeners</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span><span style="color: #6c6;">&#40;</span>this<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">do</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">SizeChanged</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span><span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">Refresh</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Range</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">with</span> set value <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;range <span style="color: #a52a2a;">&lt;-</span> value <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;itemSource <span style="color: #a52a2a;">&lt;-</span> calculateItems<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">and</span> get <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> range<br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Function</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">with</span> set value <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f <span style="color: #a52a2a;">&lt;-</span> value<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;itemSource <span style="color: #a52a2a;">&lt;-</span> calculateItems<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">and</span> get <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> f<br />
<br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Points</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">with</span> get <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">GetValue</span><span style="color: #6c6;">&#40;</span>FunctionSeries<span style="color: #a52a2a;">.</span><span style="color: #060;">PointsProperty</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> PointCollection<br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">and</span> set <span style="color: #6c6;">&#40;</span>value <span style="color: #a52a2a;">:</span> PointCollection<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">SetValue</span><span style="color: #6c6;">&#40;</span>FunctionSeries<span style="color: #a52a2a;">.</span><span style="color: #060;">PointsProperty</span>, value<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;interface IAxisListener <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">AxisInvalidated</span><span style="color: #6c6;">&#40;</span>a<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> this<span style="color: #a52a2a;">.</span><span style="color: #060;">Refresh</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <br />
<br />
&nbsp; &nbsp;interface IRangeProvider <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; member this<span style="color: #a52a2a;">.</span><span style="color: #060;">GetRange</span><span style="color: #6c6;">&#40;</span>consumer <span style="color: #a52a2a;">:</span> IRangeConsumer <span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">if</span> obj<span style="color: #a52a2a;">.</span><span style="color: #060;">ReferenceEquals</span><span style="color: #6c6;">&#40;</span>consumer, xaxis<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> range <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;itemSource <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">cast</span><span style="color: #a52a2a;">&lt;</span>Point<span style="color: #a52a2a;">&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> p <span style="color: #a52a2a;">-&gt;</span> p<span style="color: #a52a2a;">.</span><span style="color: #060;">X</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">range</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> range <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Some <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> Range<span style="color: #a52a2a;">&lt;</span>IComparable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> None <span style="color: #a52a2a;">-&gt;</span> Range<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">else</span> <span style="color: #06c; font-weight: bold;">if</span> obj<span style="color: #a52a2a;">.</span><span style="color: #060;">ReferenceEquals</span><span style="color: #6c6;">&#40;</span>consumer, yaxis<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> range <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;itemSource <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">cast</span><span style="color: #a52a2a;">&lt;</span>Point<span style="color: #a52a2a;">&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> p <span style="color: #a52a2a;">-&gt;</span> p<span style="color: #a52a2a;">.</span><span style="color: #060;">Y</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">range</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> range <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Some <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> Range<span style="color: #a52a2a;">&lt;</span>IComparable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmin"><span style="color: #06c; font-weight: bold;">min</span></a>, <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALmax"><span style="color: #06c; font-weight: bold;">max</span></a><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> None <span style="color: #a52a2a;">-&gt;</span> Range<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">else</span> Range<span style="color: #a52a2a;">&lt;</span>IComparable<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>STAThread<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
<span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> window <span style="color: #a52a2a;">=</span> Window<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> app <span style="color: #a52a2a;">=</span> Application<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> chart <span style="color: #a52a2a;">=</span> Chart<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>parabola<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> functionSeries <span style="color: #a52a2a;">=</span> FunctionSeries<span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> x <span style="color: #a52a2a;">*</span> x<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>sine wave<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;functionSeries<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Function</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> Math<span style="color: #a52a2a;">.</span><span style="color: #060;">Sin</span> x<br />
&nbsp; &nbsp;functionSeries<span style="color: #a52a2a;">.</span><span style="color: #060;">Range</span> <span style="color: #a52a2a;">&lt;-</span> Range<span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">-</span><span style="color: #c6c;">10.0</span>, <span style="color: #c6c;">10.0</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>square wave<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;functionSeries<span style="color: #a52a2a;">.</span><span style="color: #060;">Range</span> <span style="color: #a52a2a;">&lt;-</span> Range<span style="color: #6c6;">&#40;</span><span style="color: #c6c;">0.0</span>, <span style="color: #c6c;">50.0</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;functionSeries<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Function</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#91;</span>3<span style="color: #a52a2a;">.</span>0<span style="color: #a52a2a;">..</span>2<span style="color: #a52a2a;">.</span>0<span style="color: #a52a2a;">..</span>49<span style="color: #a52a2a;">.</span>0<span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">fold</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> a b <span style="color: #a52a2a;">-&gt;</span> a <span style="color: #a52a2a;">+</span> Math<span style="color: #a52a2a;">.</span><span style="color: #060;">Sin</span><span style="color: #6c6;">&#40;</span>b <span style="color: #a52a2a;">*</span> x<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">/</span> b<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>Math<span style="color: #a52a2a;">.</span><span style="color: #060;">Sin</span> x<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;window<span style="color: #a52a2a;">.</span><span style="color: #060;">Width</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #c6c;">1050.0</span><span style="color: #a52a2a;">;</span> window<span style="color: #a52a2a;">.</span><span style="color: #060;">Height</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #c6c;">400.0</span><br />
<br />
&nbsp; &nbsp;chart<span style="color: #a52a2a;">.</span><span style="color: #060;">Axes</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span><span style="color: #6c6;">&#40;</span>LinearAxis<span style="color: #6c6;">&#40;</span>Orientation <span style="color: #a52a2a;">=</span> AxisOrientation<span style="color: #a52a2a;">.</span><span style="color: #060;">X</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;chart<span style="color: #a52a2a;">.</span><span style="color: #060;">Axes</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span><span style="color: #6c6;">&#40;</span>LinearAxis<span style="color: #6c6;">&#40;</span>Orientation <span style="color: #a52a2a;">=</span> AxisOrientation<span style="color: #a52a2a;">.</span><span style="color: #060;">Y</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;chart<span style="color: #a52a2a;">.</span><span style="color: #060;">Series</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Add</span> functionSeries<br />
<br />
&nbsp; &nbsp;window<span style="color: #a52a2a;">.</span><span style="color: #060;">Content</span> <span style="color: #a52a2a;">&lt;-</span> chart<br />
&nbsp; &nbsp;app<span style="color: #a52a2a;">.</span><span style="color: #060;">Run</span><span style="color: #6c6;">&#40;</span>window<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><br />
&nbsp;</div><br />
<br />
<br />
<br />
you will also require this xaml file:<br />
<div class="xml"><br />
<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;Style</span></span><br />
<span style="color: #009900;"> &nbsp; <span style="color: #ff00ff;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span></span><br />
<span style="color: #009900;"> &nbsp; <span style="color: #ff00ff;">xmlns:x</span>=<span style="color: #ff0000;">&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span> </span><br />
<span style="color: #009900;"> &nbsp; <span style="color: #ff00ff;">xmlns:local</span>=<span style="color: #ff0000;">&quot;clr-namespace:Charts;assembly=achart&quot;</span> &nbsp; &nbsp;</span><br />
<span style="color: #009900;"> &nbsp; <span style="color: #ff00ff;">TargetType</span>=<span style="color: #ff0000;">&quot;local:FunctionSeries&quot;</span><span style="color: #bbbb00; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;Setter</span> <span style="color: #ff00ff;">Property</span>=<span style="color: #ff0000;">&quot;Template&quot;</span><span style="color: #bbbb00; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;Setter.Value<span style="color: #bbbb00; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;ControlTemplate</span> <span style="color: #ff00ff;">TargetType</span>=<span style="color: #ff0000;">&quot;local:FunctionSeries&quot;</span><span style="color: #bbbb00; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;Canvas</span> <span style="color: #ff00ff;">x:Name</span>=<span style="color: #ff0000;">&quot;canvas&quot;</span><span style="color: #bbbb00; font-weight: bold;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;Polyline</span> <span style="color: #ff00ff;">Points</span>=<span style="color: #ff0000;">&quot;{TemplateBinding Points}&quot;</span> <span style="color: #ff00ff;">Stroke</span>=<span style="color: #ff0000;">&quot;Red&quot;</span> <span style="color: #ff00ff;">StrokeThickness</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #ff00ff;">StrokeMiterLimit</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #bbbb00; font-weight: bold;">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;/Canvas<span style="color: #bbbb00; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;/ControlTemplate<span style="color: #bbbb00; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;/Setter.Value<span style="color: #bbbb00; font-weight: bold;">&gt;</span></span></span> &nbsp; <br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;/Setter<span style="color: #bbbb00; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #bbbb00; font-weight: bold;">&lt;/Style<span style="color: #bbbb00; font-weight: bold;">&gt;</span></span></span><br />
&nbsp;</div><br />
note that you will have to replace "assembly=achart" in the xaml file with the name of your project/assembly.<br />
<br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=94</comments>
 <pubDate>Sat, 2 May 2009 02:16:09 +0000</pubDate>
</item><item>
 <title>iterators in perl using unix pipes.</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=92</link>
<description><![CDATA[<div class="perl"><br />
<span style="color: #b1b100; font-weight: bold;">sub</span> yieldfor<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>\<span style="color: #339933;">&amp;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://perldoc.perl.org/functions/open.html"><span style="color: #ff9900;">open</span></a><span style="color: #009900;">&#40;</span>TO<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;-|&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009999;">&lt;TO&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">&amp;</span><span style="color: #009900;">&#123;</span><span style="color: #ff00ff;">$_</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/close.html"><span style="color: #ff9900;">close</span></a><span style="color: #009900;">&#40;</span>TO<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #339933;">&amp;</span><span style="color: #009900;">&#123;</span><span style="color: #ff00ff;">$_</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100; font-weight: bold;">sub</span> yield<span style="color: #009900;">&#40;</span><span style="color: #ff00ff;">$)</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span style="color: #ff9900;">print</span></a> <span style="color: #ff0000;">&quot;$_[0]<span style="color: #06CFFF; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;</div><br />
<br />
<h1>example usage</h1><br />
<div class="perl"><span style="color: #b1b100; font-weight: bold;">sub</span> fib<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #DDDD00;">$a</span><span style="color: #339933;">,</span> <span style="color: #DDDD00;">$b</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; yield <span style="color: #DDDD00;">$b</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#40;</span><span style="color: #DDDD00;">$a</span><span style="color: #339933;">,</span> <span style="color: #DDDD00;">$b</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #DDDD00;">$b</span><span style="color: #339933;">,</span> <span style="color: #DDDD00;">$a</span> <span style="color: #339933;">+</span> <span style="color: #DDDD00;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
yieldfor <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span style="color: #ff9900;">print</span></a><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #339933;">&amp;</span>fib<span style="color: #339933;">;</span><br />
&nbsp;</div><br />
]]></description>
 <category>perl</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=92</comments>
 <pubDate>Thu, 30 Apr 2009 22:54:00 +0000</pubDate>
</item><item>
 <title>Red-Black tree.</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=85</link>
<description><![CDATA[<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<br />
<span style="color: #06c; font-weight: bold;">type</span> Colour <span style="color: #a52a2a;">=</span> <span style="color: #a52a2a;">|</span> Red <span style="color: #a52a2a;">|</span> Black<br />
<span style="color: #06c; font-weight: bold;">type</span> <span style="color: #a52a2a;">'</span>a Tree <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node <span style="color: #06c; font-weight: bold;">of</span> <span style="color: #a52a2a;">'</span>a <span style="color: #a52a2a;">*</span> <span style="color: #a52a2a;">'</span>a Tree <span style="color: #a52a2a;">*</span> <span style="color: #a52a2a;">'</span>a Tree <span style="color: #a52a2a;">*</span> Colour<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> balance <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>y, Node<span style="color: #6c6;">&#40;</span>x, a, b, Red<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>z, c, d, Red<span style="color: #6c6;">&#41;</span>, Black<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>x, a, Node<span style="color: #6c6;">&#40;</span>z, Node<span style="color: #6c6;">&#40;</span>y, b, c, Red<span style="color: #6c6;">&#41;</span>, d, Red<span style="color: #6c6;">&#41;</span>, Black<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>x, a, Node<span style="color: #6c6;">&#40;</span>y, b, Node<span style="color: #6c6;">&#40;</span>z, c, d, Red<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span>, Black<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>z, Node<span style="color: #6c6;">&#40;</span>x, a, Node<span style="color: #6c6;">&#40;</span>y, b, c, Red<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span>, d, Black<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>z, Node<span style="color: #6c6;">&#40;</span>y, Node<span style="color: #6c6;">&#40;</span>x, a, b, Red<span style="color: #6c6;">&#41;</span>, c, Red<span style="color: #6c6;">&#41;</span>, d, Black<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>y, Node<span style="color: #6c6;">&#40;</span>x, a, b, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>z, c, d, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> a <span style="color: #a52a2a;">-&gt;</span> a<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> makeblack <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, _<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, Black<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> Leaf<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> makered <span style="color: #6c6;">&#40;</span>Node<span style="color: #6c6;">&#40;</span>i, l, r, _<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, Red<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> search tree value <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> None<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, _, _<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> search l value<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, _, r, _<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i <span style="color: #a52a2a;">-&gt;</span> search r value<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> Some value<br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> add tree value <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> insert <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>value, Leaf, Leaf, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, c<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, insert l, r, c<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> balance<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, c<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, l, insert r, c<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> balance<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> a <span style="color: #a52a2a;">-&gt;</span> a<br />
<br />
&nbsp; &nbsp;insert tree <span style="color: #a52a2a;">|&gt;</span> makeblack <br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> remove tree value <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> number <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> None<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> rem <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>red <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span>black<span style="color: #6c6;">&#41;</span>, black<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Red<span style="color: #6c6;">&#41;</span>, Black<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> balance<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Red<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, Black<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> balance<br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>red <span style="color: #a52a2a;">-&gt;</span> black<span style="color: #a52a2a;">/</span>red<span style="color: #a52a2a;">/</span>leaf, <span style="color: #6c6;">&#40;</span>red<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>p, l, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> p <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>p, l, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>p, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span>, r, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> p <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>p, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, r, Red<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>red <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span>black<span style="color: #6c6;">&#41;</span>, red<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n1, Node<span style="color: #6c6;">&#40;</span>n0, l0, r0, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span>, n4, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> n3 <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>n1, Node<span style="color: #6c6;">&#40;</span>n0, l0, r0, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, n4, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>n1, n0, Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>n4, l4, r4, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> n1 <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n1, n0, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, Node<span style="color: #6c6;">&#40;</span>n4, l4, r4, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span><span style="color: #6c6;">&#40;</span>red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> leaf<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Leaf, Leaf, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">=</span> i <span style="color: #a52a2a;">-&gt;</span> Leaf<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, Leaf, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">=</span> i <span style="color: #a52a2a;">-&gt;</span> l<br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>non<span style="color: #a52a2a;">-</span>leaf <span style="color: #06c; font-weight: bold;">match</span><span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, Red<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">as</span> a <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">=</span> i <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">//</span>find successor<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> a <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Red<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> remsuccessor, Black<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> balance<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>p, l, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>p, l, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> remsuccessor, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n1, Node<span style="color: #6c6;">&#40;</span>n0, l0, r0, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span>, n4, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>n1, Node<span style="color: #6c6;">&#40;</span>n0, l0, r0, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, n4, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> rem, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">and</span> remsuccessor <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>i, Node<span style="color: #6c6;">&#40;</span>j, jl, jr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> remsuccessor, Node<span style="color: #6c6;">&#40;</span>k, kl, kr, Red<span style="color: #6c6;">&#41;</span>, Black<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> balance<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>p, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span>, r, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>p, Node<span style="color: #6c6;">&#40;</span>c, cl, cr, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> remsuccessor, r, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>n1, n0, Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, Node<span style="color: #6c6;">&#40;</span>n4, l4, r4, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Node<span style="color: #6c6;">&#40;</span>n3, Node<span style="color: #6c6;">&#40;</span>n1, n0, Node<span style="color: #6c6;">&#40;</span>n2, l2, r2, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> remsuccessor, Node<span style="color: #6c6;">&#40;</span>n4, l4, r4, Black<span style="color: #6c6;">&#41;</span>, Red<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Leaf, Leaf, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> number <span style="color: #a52a2a;">:=</span> Some i<span style="color: #a52a2a;">;</span> Leaf<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Leaf, r, Red<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> number <span style="color: #a52a2a;">:=</span> Some i<span style="color: #a52a2a;">;</span> r<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">and</span> check tree <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> <span style="color: #a52a2a;">!</span>number <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Some x <span style="color: #a52a2a;">-&gt;</span> switch x tree<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> None <span style="color: #a52a2a;">-&gt;</span> tree<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">and</span> switch x <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">function</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, c<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, switch x l, r, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, c<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, l, switch x r, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, c<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">=</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>x, l, r, c<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;tree <span style="color: #a52a2a;">|&gt;</span> makered <span style="color: #a52a2a;">|&gt;</span> rem <span style="color: #a52a2a;">|&gt;</span> makeblack <span style="color: #a52a2a;">|&gt;</span> check<br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> traverse tree <span style="color: #a52a2a;">=</span> seq <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r, _<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; yield<span style="color: #a52a2a;">!</span> traverse l<br />
&nbsp; &nbsp; &nbsp; yield i<br />
&nbsp; &nbsp; &nbsp; yield<span style="color: #a52a2a;">!</span> traverse r<br />
<span style="color: #6c6;">&#125;</span><br />
<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> sort x <span style="color: #a52a2a;">=</span> x <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">fold</span> add Leaf <span style="color: #a52a2a;">|&gt;</span> traverse<br />
&nbsp;</div><br />
previous: <a href="http://blog.turbofriendship.com/index.php?itemid=80">binary search tree</a><br />
<br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=85</comments>
 <pubDate>Wed, 18 Mar 2009 15:30:32 +0000</pubDate>
</item><item>
 <title>Binary search tree</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=80</link>
<description><![CDATA[<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<br />
<span style="color: #06c; font-weight: bold;">type</span> Tree<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node <span style="color: #06c; font-weight: bold;">of</span> <span style="color: #a52a2a;">'</span>a <span style="color: #a52a2a;">*</span> Tree<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span> <span style="color: #a52a2a;">*</span> Tree<span style="color: #a52a2a;">&lt;'</span>a<span style="color: #a52a2a;">&gt;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> add tree value <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>value, Leaf, Leaf<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, add l value, r<span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, l, add r value<span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> tree<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> remove tree value <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> successor tree <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Leaf, _<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> i<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>_, l, _<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> successor l<br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, remove l value, r<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i <span style="color: #a52a2a;">-&gt;</span> Node<span style="color: #6c6;">&#40;</span>i, l, remove r value<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Leaf, Leaf<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> i <span style="color: #a52a2a;">=</span> value <span style="color: #a52a2a;">-&gt;</span> Leaf<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, Leaf<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> i <span style="color: #a52a2a;">=</span> value <span style="color: #a52a2a;">-&gt;</span> l<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, Leaf, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> i <span style="color: #a52a2a;">=</span> value <span style="color: #a52a2a;">-&gt;</span> r<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> i <span style="color: #a52a2a;">=</span> value <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>find in<span style="color: #a52a2a;">-</span>order successor <span style="color: #6c6;">&#40;</span>left<span style="color: #a52a2a;">-</span>most child <span style="color: #06c; font-weight: bold;">of</span> right subtree<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> j <span style="color: #a52a2a;">=</span> successor r<br />
&nbsp; &nbsp; &nbsp; Node<span style="color: #6c6;">&#40;</span>j, l, remove r j<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> search tree value <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> None<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, _<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&lt;</span> i <span style="color: #a52a2a;">-&gt;</span> search l value<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, _, r<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">when</span> value <span style="color: #a52a2a;">&gt;</span> i<span style="color: #a52a2a;">-&gt;</span> search r value<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> Some value<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">rec</span> traverse tree <span style="color: #a52a2a;">=</span> seq <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> tree <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Leaf <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Node<span style="color: #6c6;">&#40;</span>i, l, r<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; yield<span style="color: #a52a2a;">!</span> traverse l<br />
&nbsp; &nbsp; &nbsp; yield i<br />
&nbsp; &nbsp; &nbsp; yield<span style="color: #a52a2a;">!</span> traverse r<br />
<span style="color: #6c6;">&#125;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> sort x <span style="color: #a52a2a;">=</span> x <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">fold</span> add Leaf <span style="color: #a52a2a;">|&gt;</span> traverse<br />
&nbsp;</div><br />
next: <a href="http://blog.turbofriendship.com/index.php?itemid=85">red-black tree</a><br />
<br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=80</comments>
 <pubDate>Wed, 18 Mar 2009 14:51:29 +0000</pubDate>
</item><item>
 <title>perl-like regular expression operators in f#</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=76</link>
<description><![CDATA[<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<span style="color: #06c; font-weight: bold;">let</span> regex s <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">new</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Text</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegularExpressions</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Regex</span><span style="color: #6c6;">&#40;</span>s,System<span style="color: #a52a2a;">.</span><span style="color: #060;">Text</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegularExpressions</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegexOptions</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Compiled</span><span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> stringorregex <span style="color: #6c6;">&#40;</span>reg <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> reg <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? System<span style="color: #a52a2a;">.</span><span style="color: #060;">Text</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegularExpressions</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Regex</span> <span style="color: #a52a2a;">-&gt;</span> reg <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Text</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegularExpressions</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Regex</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? string <span style="color: #a52a2a;">-&gt;</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Text</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegularExpressions</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Regex</span> <span style="color: #6c6;">&#40;</span>reg <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> string<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;regular expression must be of type &lt;regex&gt; or &lt;string&gt;.&quot;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span>~<span style="color: #6c6;">&#41;</span> reg str <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>stringorregex reg<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">IsMatch</span><span style="color: #6c6;">&#40;</span>str<span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">^</span>~<span style="color: #6c6;">&#41;</span> reg str <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">not</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>stringorregex reg<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">IsMatch</span><span style="color: #6c6;">&#40;</span>str<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span>~~<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>reg <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> str <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> m <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>stringorregex reg<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Match</span><span style="color: #6c6;">&#40;</span>str<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span><span style="color: #060;">m</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Groups</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Count</span> <span style="color: #a52a2a;">-</span> <span style="color: #c6c;">1</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span>m<span style="color: #a52a2a;">.</span><span style="color: #060;">Groups</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Item</span><span style="color: #6c6;">&#40;</span>x<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Value</span><span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span>~~~<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>reg <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> str <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> groups <span style="color: #6c6;">&#40;</span>m <span style="color: #a52a2a;">:</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Text</span><span style="color: #a52a2a;">.</span><span style="color: #060;">RegularExpressions</span><span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Match</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span><span style="color: #060;">m</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Groups</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Count</span> <span style="color: #a52a2a;">-</span> <span style="color: #c6c;">1</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span>m<span style="color: #a52a2a;">.</span><span style="color: #060;">Groups</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Item</span><span style="color: #6c6;">&#40;</span>x<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Value</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> m <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>stringorregex reg<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">Match</span><span style="color: #6c6;">&#40;</span>str<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;seq <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">while</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>m<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Success</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yield groups <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>m<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m <span style="color: #a52a2a;">:=</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>m<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">NextMatch</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#125;</span><br />
&nbsp;</div><br />
<br />
<br />
<h1>Example usage</h1><br />
<div class="ocaml">regex <span style="color: #3cb371;">&quot;d[a-z]g&quot;</span> <span style="color: #a52a2a;">=</span>~ <span style="color: #3cb371;">&quot;the dog is brown&quot;</span> <span style="color: #a52a2a;">|&gt;</span> printf <span style="color: #3cb371;">&quot;%b\n&quot;</span></div><br />
prints: true<br />
<br />
<div class="ocaml"><br />
<span style="color: #3cb371;">&quot;d[a-z]g&quot;</span> <span style="color: #a52a2a;">^</span>~ <span style="color: #3cb371;">&quot;the dog is brown&quot;</span> <span style="color: #a52a2a;">|&gt;</span> printf <span style="color: #3cb371;">&quot;%b\n&quot;</span></div><br />
prints: false<br />
<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#91;</span>_<span style="color: #a52a2a;">;</span> the<span style="color: #a52a2a;">;</span> pen<span style="color: #a52a2a;">;</span> works<span style="color: #a52a2a;">;</span> correctly<span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">=</span> <span style="color: #3cb371;">&quot;(\w+) (\w+) (\w+) (\w+)&quot;</span> <span style="color: #a52a2a;">=</span>~~ <span style="color: #3cb371;">&quot;the pen works correctly&quot;</span><br />
printf <span style="color: #3cb371;">&quot;%s,%s,%s,%s\n&quot;</span> the pen works correctly</div><br />
prints: the,pen,works,corectly<br />
<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">for</span> i <span style="color: #06c; font-weight: bold;">in</span> <span style="color: #3cb371;">&quot;(\w+) (\w+)&quot;</span> <span style="color: #a52a2a;">=</span>~~~ <span style="color: #3cb371;">&quot;james 12 charles 78 helmut 43&quot;</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp;printf <span style="color: #3cb371;">&quot;[%s,%s] &quot;</span> i<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span><span style="color: #c6c;">1</span><span style="color: #6c6;">&#93;</span> i<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span><span style="color: #c6c;">2</span><span style="color: #6c6;">&#93;</span></div><br />
prints: [james,12] [charles,78] [helmut,43]<br />
<br />
<div class="ocaml"><br />
<span style="color: #3cb371;">&quot;.o&quot;</span> <span style="color: #a52a2a;">=</span>~~~ <span style="color: #3cb371;">&quot;do you remember willo the wisp?&quot;</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>x <span style="color: #a52a2a;">::</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> x<span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">iter</span> <span style="color: #6c6;">&#40;</span>printf <span style="color: #3cb371;">&quot;[%s] &quot;</span><span style="color: #6c6;">&#41;</span></div><br />
prints: [do] [yo] [lo]<br />
<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">let</span> split <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>regex <span style="color: #3cb371;">&quot; &quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Split</span><span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;i fancy he is a bedlamite&quot;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">for</span> word <span style="color: #06c; font-weight: bold;">in</span> split <span style="color: #06c; font-weight: bold;">do</span> printf <span style="color: #3cb371;">&quot;%s, &quot;</span> word</div><br />
prints: i, fancy, he, is, a, bedlamite,<br />
<br />
<div class="ocaml"><br />
<span style="color: #6c6;">&#91;</span>1<span style="color: #a52a2a;">..</span>100<span style="color: #6c6;">&#93;</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> string <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span>~<span style="color: #6c6;">&#41;</span> <span style="color: #3cb371;">&quot;1.+&quot;</span><span style="color: #6c6;">&#41;</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">iter</span> <span style="color: #6c6;">&#40;</span>printf <span style="color: #3cb371;">&quot;%s,&quot;</span><span style="color: #6c6;">&#41;</span></div><br />
prints: 10,11,12,13,14,15,16,17,18,19,100,<br />
<br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=76</comments>
 <pubDate>Fri, 27 Feb 2009 15:20:39 +0000</pubDate>
</item><item>
 <title>SdlSimple highlights</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=42</link>
<description><![CDATA[<a href="http://blog.turbofriendship.com/index.php?itemid=14"><br />
previous: sdlSimple</a><br />
<br />
ummmm...i thought i would highlight some things i learned while writing this library:<br />
<br />
<br />
<br />
<h1>Importing functions from external c++ libraries</h1><br />
a couple of examples:<br />
<br />
<div class="ocaml"><span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span>, EntryPoint<span style="color: #a52a2a;">=</span><span style="color: #3cb371;">&quot;colour&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern int colourC<span style="color: #6c6;">&#40;</span>byte r, byte g, byte b<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #a52a2a;">//</span>useage<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> yellow <span style="color: #a52a2a;">=</span> colourC<span style="color: #6c6;">&#40;</span>255uy, 255uy, 0uy<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit setScreen<span style="color: #6c6;">&#40;</span>IntPtr pixels, int width, int height, int depth<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #a52a2a;">//</span>usage<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span>screen <span style="color: #a52a2a;">:</span> IntPtr<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_SetVideoMode</span><span style="color: #6c6;">&#40;</span><span style="color: #c6c;">640</span>, <span style="color: #c6c;">480</span>, <span style="color: #c6c;">32</span>, Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_DOUBLEBUF</span> <span style="color: #a52a2a;">|||</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_HWPALETTE</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span>surface <span style="color: #a52a2a;">:</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Surface</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">PtrToStructure</span><span style="color: #6c6;">&#40;</span>screen, typeof<span style="color: #a52a2a;">&lt;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Surface</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Surface</span><br />
<span style="color: #06c; font-weight: bold;">let</span> buffer <span style="color: #a52a2a;">=</span> surface<span style="color: #a52a2a;">.</span><span style="color: #060;">pixels</span><br />
setScreen<span style="color: #6c6;">&#40;</span>buffer, sdlWidth, sdlHeight, sdlDepth<span style="color: #6c6;">&#41;</span><br />
&nbsp;</div> <br />
<br />
<br />
<h1>Marshaling an array of structs from c++ to f#</h1><br />
'getPalette' is a c++ function that takes a file location as argument and returns an array of SDL_Color structs (which are 32-bit int's basically).<br />
to access the returned array in f# it would seem you have to increment the returned pointer and reconstruct the array.<br />
<div class="ocaml"><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern IntPtr getPalette<span style="color: #6c6;">&#40;</span>string pal<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>palette <span style="color: #a52a2a;">:</span> IntPtr<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>getPalette<span style="color: #6c6;">&#40;</span>file<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> colours <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">|</span>0<span style="color: #a52a2a;">..</span>255<span style="color: #a52a2a;">|</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html"><span style="color: #06c; font-weight: bold;">Array</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> i <span style="color: #a52a2a;">-&gt;</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">for</span> i <span style="color: #06c; font-weight: bold;">in</span> <span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span>255<span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp;colours<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span>i<span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">PtrToStructure</span><span style="color: #6c6;">&#40;</span>palette, typeof<span style="color: #a52a2a;">&lt;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;palette <span style="color: #a52a2a;">&lt;-</span> IntPtr<span style="color: #6c6;">&#40;</span>palette<span style="color: #a52a2a;">.</span><span style="color: #060;">ToInt32</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">+</span> sizeof<span style="color: #a52a2a;">&lt;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp;</div><br />
<br />
<br />
<h1>F# keywords are not allowed as method names</h1><br />
because 'type' is a f# reserved keyword i was unable to extract the event type from an sdl event structure with 'event.type'<br />
i was able to overcome this by writing a short c# library that did this for me.<br />
<br />
so:<br />
<div class="ocaml"><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">type</span></div><br />
became:<br />
<div class="ocaml">GetEventType<span style="color: #a52a2a;">.</span><span style="color: #060;">Get</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span></div><br />
using this c# dll:<br />
<div class="ocaml"><br />
using Tao<span style="color: #a52a2a;">.</span><span style="color: #060;">Sdl</span><span style="color: #a52a2a;">;</span><br />
public <span style="color: #06c; font-weight: bold;">class</span> GetEventType <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public static int Get<span style="color: #6c6;">&#40;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Event</span> e<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return e<span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">type</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<span style="color: #6c6;">&#125;</span></div><br />
i encountered a similar problem with the 'val' keyword which was solved using this dll:<br />
<div class="ocaml"><br />
using Tao<span style="color: #a52a2a;">.</span><span style="color: #060;">Sdl</span><span style="color: #a52a2a;">;</span><br />
public <span style="color: #06c; font-weight: bold;">class</span> GetJaxisValue <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public static short Get<span style="color: #6c6;">&#40;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Event</span> e<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return e<span style="color: #a52a2a;">.</span><span style="color: #060;">jaxis</span><span style="color: #a52a2a;">.</span><span style="color: #06c; font-weight: bold;">val</span><span style="color: #a52a2a;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#125;</span><br />
<span style="color: #6c6;">&#125;</span><br />
&nbsp;</div>if anyone knows of a superior way of handling this problem, i would like to know.<br />
<br />
<br />
<br />
<h1>Overloaded functions</h1> <br />
overloaded functions are not presently availible in f# but you can match on types which achieves a similar result:<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">let</span> write c <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> data <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? string <span style="color: #a52a2a;">-&gt;</span> writeString<span style="color: #6c6;">&#40;</span>x, y, <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> string<span style="color: #6c6;">&#41;</span>, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? int <span style="color: #a52a2a;">-&gt;</span> writeInt<span style="color: #6c6;">&#40;</span>x, y, <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> int<span style="color: #6c6;">&#41;</span>, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? double <span style="color: #a52a2a;">-&gt;</span> writeDouble<span style="color: #6c6;">&#40;</span>x, y, <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> double<span style="color: #6c6;">&#41;</span>, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;data type not supported.&quot;</span><br />
&nbsp;</div><br />
<br />
<br />
<h1>Events</h1><br />
for those unfamiliar with SDL (<a href="http://www.libsdl.org">www.libsdl.org</a>) it requires you to create an infinite loop that listens for sdl events and reacts to them.  this can be seen in the <a href="http://blog.turbofriendship.com/index.php?itemid=14">previous entry</a> under 'sdl event loop'.<br />
<br />
in this loop i convert the wanted native SDL events into f# events of the type union 'sdlevent':<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">type</span> sdlevent <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> KeyUp <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> KeyDown <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> MouseMove <span style="color: #06c; font-weight: bold;">of</span> int <span style="color: #a52a2a;">*</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">...</span><span style="color: #060;">etc</span><span style="color: #a52a2a;">...</span></div><br />
and fire them into the 'events' IEvent.<br />
<br />
you can then listen for these events using the regular f# Event methods:<br />
<div class="ocaml"><br />
events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> e <span style="color: #06c; font-weight: bold;">with</span> <br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> KeyDown x <span style="color: #a52a2a;">-&gt;</span> printf <span style="color: #3cb371;">&quot;%s pressed.\n&quot;</span> <span style="color: #6c6;">&#40;</span>scancodeToKey x<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> KeyUp x <span style="color: #a52a2a;">-&gt;</span> printf <span style="color: #3cb371;">&quot;%s released.\n&quot;</span> <span style="color: #6c6;">&#40;</span>scancodeToKey x<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#41;</span><br />
&nbsp;</div><br />
<br />
<br />
<h1>Drawing</h1><br />
SdlSimple keeps a list of functions in 'drawevents' and executes each one on every iteration of the sdl event loop like so:<br />
<div class="ocaml"><span style="color: #06c; font-weight: bold;">for</span> <span style="color: #6c6;">&#40;</span>s, e<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">in</span> drawevents <span style="color: #06c; font-weight: bold;">do</span> e<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span></div><br />
you draw to the screen by adding a function that utilizes one or more drawing methods (pixel, line, write, rectangle, colour) to the 'drawevents' list using the 'drawfire' event firing function.<br />
<br />
this will add the 'hello' function to the 'drawevents' list thus writing "hello" to the screen:<br />
<div class="ocaml"><br />
drawfire <span style="color: #6c6;">&#40;</span>Draw <span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;hello&quot;</span>, <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp;write <span style="color: #6c6;">&#40;</span>colour <span style="color: #c6c;">255</span> <span style="color: #c6c;">255</span> <span style="color: #c6c;">255</span><span style="color: #6c6;">&#41;</span> <span style="color: #3cb371;">&quot;hello&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">100</span>, <span style="color: #c6c;">100</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span></div><br />
and this will remove it from the same list; erasing it from the screen:<br />
<div class="ocaml">drawfire <span style="color: #6c6;">&#40;</span>Erease <span style="color: #3cb371;">&quot;hello&quot;</span><span style="color: #6c6;">&#41;</span></div><br />
<br />
<br />
<h1>Event and drawing DSL's</h1><br />
this is most likely an abuse of the f# monad syntax but i believe it allows for a concise way of drawing and responding to simple events:<br />
<div class="ocaml"><br />
<span style="color: #a52a2a;">//</span>draw monad<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">type</span> DrawMonad<span style="color: #6c6;">&#40;</span>name<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Delay</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> drawfire <span style="color: #6c6;">&#40;</span>Draw <span style="color: #6c6;">&#40;</span>name, f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Zero</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> draw <span style="color: #a52a2a;">=</span> DrawMonad<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;draw&quot;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> drawn name <span style="color: #a52a2a;">=</span> DrawMonad<span style="color: #6c6;">&#40;</span>name<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #a52a2a;">//</span>event monad<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">type</span> EventMonad<span style="color: #6c6;">&#40;</span>evnt<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Delay</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> e <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> x <span style="color: #06c; font-weight: bold;">when</span> x <span style="color: #a52a2a;">=</span> evnt <span style="color: #a52a2a;">-&gt;</span> f<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Zero</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> onevent e <span style="color: #a52a2a;">=</span> EventMonad<span style="color: #6c6;">&#40;</span>e<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #a52a2a;">//</span>clear the screen<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> cls <span style="color: #6c6;">&#40;</span>str <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> str <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? string <span style="color: #a52a2a;">-&gt;</span> drawfire <span style="color: #6c6;">&#40;</span>Erase <span style="color: #6c6;">&#40;</span>str <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> string<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> drawfire <span style="color: #6c6;">&#40;</span>Erase <span style="color: #3cb371;">&quot;draw&quot;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp;</div><br />
the above classes allow you to write code like this:<br />
<div class="ocaml"><br />
<span style="color: #a52a2a;">//</span>draw a green triangle<span style="color: #a52a2a;">:</span><br />
drawn <span style="color: #3cb371;">&quot;triangle&quot;</span> <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> green <span style="color: #a52a2a;">=</span> colour <span style="color: #c6c;">0</span> <span style="color: #c6c;">255</span> <span style="color: #c6c;">0</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#40;</span><span style="color: #c6c;">150</span>, <span style="color: #c6c;">100</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">200</span>, <span style="color: #c6c;">200</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">100</span>, <span style="color: #c6c;">200</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">150</span>, <span style="color: #c6c;">100</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> Seq<span style="color: #a52a2a;">.</span><span style="color: #060;">reduce</span> <span style="color: #6c6;">&#40;</span>line green<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><br />
<span style="color: #6c6;">&#125;</span><br />
<br />
<span style="color: #a52a2a;">//</span>erease the triangle <span style="color: #06c; font-weight: bold;">when</span> <span style="color: #a52a2a;">'</span>enter<span style="color: #a52a2a;">'</span> is pressed<span style="color: #a52a2a;">:</span><br />
onevent <span style="color: #6c6;">&#40;</span>KeyDown <span style="color: #c6c;">13</span><span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#123;</span><br />
&nbsp; &nbsp;cls <span style="color: #3cb371;">&quot;triangle&quot;</span><br />
<span style="color: #6c6;">&#125;</span><br />
&nbsp;</div> <br />
<br />
<br />
<h1>Checking for a file in multiple locations</h1><br />
List.find returns the fist element for which the given function returns true and throws a 'KeyNotFoundException' if no such element exists.<br />
<div class="ocaml"><br />
<span style="color: #06c; font-weight: bold;">try</span> <span style="color: #6c6;">&#91;</span><span style="color: #3cb371;">&quot;/usr/local/share/libpcxf/palette.gpl&quot;</span><span style="color: #a52a2a;">;</span> <span style="color: #3cb371;">&quot;/usr/share/libpcxf/palette.gpl&quot;</span><span style="color: #a52a2a;">;</span> <span style="color: #3cb371;">&quot;palette.gpl&quot;</span><span style="color: #6c6;">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">find</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">IO</span><span style="color: #a52a2a;">.</span><span style="color: #060;">File</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Exists</span> <span style="color: #a52a2a;">|&gt;</span> setPalette <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a> <span style="color: #06c; font-weight: bold;">with</span> <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp;</div><br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=42</comments>
 <pubDate>Tue, 24 Feb 2009 19:24:15 +0000</pubDate>
</item><item>
 <title>SdlSimple</title>
 <link>http://blog.turbofriendship.comindex.php?itemid=14</link>
<description><![CDATA[<a href="http://blog.turbofriendship.com/index.php?itemid=12">previous: Compiling Game of Life</a><br />
<a href="http://blog.turbofriendship.com/index.php?itemid=42">next: SdlSimple highlights</a><br />
<div class="ocaml"><br />
<span style="color: #a52a2a;">#</span>light<br />
<span style="color: #a52a2a;">#</span>nowarn <span style="color: #3cb371;">&quot;9&quot;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">open</span> System<br />
<span style="color: #06c; font-weight: bold;">open</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Runtime</span><span style="color: #a52a2a;">.</span><span style="color: #060;">InteropServices</span><br />
<span style="color: #06c; font-weight: bold;">open</span> Microsoft<span style="color: #a52a2a;">.</span><span style="color: #060;">FSharp</span><span style="color: #a52a2a;">.</span><span style="color: #060;">NativeInterop</span><br />
<span style="color: #06c; font-weight: bold;">open</span> Tao<span style="color: #a52a2a;">.</span><span style="color: #060;">Sdl</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> println x <span style="color: #a52a2a;">=</span> print_any x<span style="color: #a52a2a;">;</span> printf <span style="color: #3cb371;">&quot;\n&quot;</span><br />
<br />
<span style="color: #a52a2a;">//</span><span style="color: #06c; font-weight: bold;">external</span> c libraries<span style="color: #a52a2a;">:</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span>, EntryPoint<span style="color: #a52a2a;">=</span><span style="color: #3cb371;">&quot;pixel&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal pixelC<span style="color: #6c6;">&#40;</span>int x, int y, int colour<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span>, EntryPoint<span style="color: #a52a2a;">=</span><span style="color: #3cb371;">&quot;colour&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern int internal colourC<span style="color: #6c6;">&#40;</span>byte r, byte g, byte b<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal setScreen<span style="color: #6c6;">&#40;</span>void <span style="color: #a52a2a;">*</span>pixels, int width, int height, int depth<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal loadFonts<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal unloadFonts<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal writeInt<span style="color: #6c6;">&#40;</span>int x, int y, int num, int colour<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal writeString<span style="color: #6c6;">&#40;</span>int x, int y, string text, int colour<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal writeDouble<span style="color: #6c6;">&#40;</span>int x, int y, double num, int colour<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span>, EntryPoint<span style="color: #a52a2a;">=</span><span style="color: #3cb371;">&quot;line&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal lineC<span style="color: #6c6;">&#40;</span>int x1, int y1, int x2, int y2, int colour<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span>, EntryPoint<span style="color: #a52a2a;">=</span><span style="color: #3cb371;">&quot;rectangle&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern unit internal rectangleC<span style="color: #6c6;">&#40;</span>int x1, int y1, int x2, int y2, int colour<span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">&lt;</span>DllImport<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;libpcxf&quot;</span><span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#93;</span><br />
extern IntPtr internal getPalette<span style="color: #6c6;">&#40;</span>string pal<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>event union<span style="color: #a52a2a;">:</span> <span style="color: #6c6;">&#40;</span>sdlFire fires these events<span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">type</span> sdlevent <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> KeyUp <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> KeyDown <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> MouseMove <span style="color: #06c; font-weight: bold;">of</span> int <span style="color: #a52a2a;">*</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> MouseUp <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> MouseDown <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> JoyAxis1 <span style="color: #06c; font-weight: bold;">of</span> int <span style="color: #a52a2a;">*</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> JoyAxis2 <span style="color: #06c; font-weight: bold;">of</span> int <span style="color: #a52a2a;">*</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> JoyButtonDown1 <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> JoyButtonDown2 <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> JoyButtonUp1 <span style="color: #06c; font-weight: bold;">of</span> int<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> JoyButtonUp2 <span style="color: #06c; font-weight: bold;">of</span> int<br />
<br />
<br />
<span style="color: #a52a2a;">//</span>draw union<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">type</span> sdldraw <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Draw <span style="color: #06c; font-weight: bold;">of</span> string <span style="color: #a52a2a;">*</span> <span style="color: #6c6;">&#40;</span>unit <span style="color: #a52a2a;">-&gt;</span> unit<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> UnDraw <span style="color: #06c; font-weight: bold;">of</span> string<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Erase <span style="color: #06c; font-weight: bold;">of</span> string<br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> drawevents <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>globals<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal sdlHeight <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal sdlWidth <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal sdlDepth <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal sdlFullScreen <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">false</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal sdlFire <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>fire events<span style="color: #a52a2a;">.</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> drawfire <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> x <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>fire draw event<span style="color: #a52a2a;">.</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> sdlScreen <span style="color: #a52a2a;">=</span> IntPtr<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> sdlBuffer <span style="color: #a52a2a;">=</span> IntPtr<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>_, events<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">create</span><span style="color: #a52a2a;">&lt;</span>sdlevent<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>catch events<span style="color: #a52a2a;">.</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>f<span style="color: #a52a2a;">#</span> wrapers <span style="color: #06c; font-weight: bold;">for</span> pcxf functions<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> inline colour <span style="color: #6c6;">&#40;</span>r <span style="color: #a52a2a;">:</span> int<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>g <span style="color: #a52a2a;">:</span> int<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>b <span style="color: #a52a2a;">:</span> int<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> &nbsp;colourC<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>byte<span style="color: #6c6;">&#41;</span> r, <span style="color: #6c6;">&#40;</span>byte<span style="color: #6c6;">&#41;</span> g, <span style="color: #6c6;">&#40;</span>byte<span style="color: #6c6;">&#41;</span> b<span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> inline pixel c <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> pixelC<span style="color: #6c6;">&#40;</span>x, y, c<span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> inline line c <span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> lineC<span style="color: #6c6;">&#40;</span>x1, y1, x2, y2, c<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">;</span> <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> inline rectangle c <span style="color: #6c6;">&#40;</span>x1, y1<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x2, y2<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> rectangleC<span style="color: #6c6;">&#40;</span>x1, y1, x2, y2, c<span style="color: #6c6;">&#41;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> write c <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> data <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? string <span style="color: #a52a2a;">-&gt;</span> writeString<span style="color: #6c6;">&#40;</span>x, y, <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> string<span style="color: #6c6;">&#41;</span>, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? int <span style="color: #a52a2a;">-&gt;</span> writeInt<span style="color: #6c6;">&#40;</span>x, y, <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> int<span style="color: #6c6;">&#41;</span>, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? double <span style="color: #a52a2a;">-&gt;</span> writeDouble<span style="color: #6c6;">&#40;</span>x, y, <span style="color: #6c6;">&#40;</span>data <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> double<span style="color: #6c6;">&#41;</span>, c<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;data type not supported.&quot;</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> writey data <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> write <span style="color: #6c6;">&#40;</span>colour <span style="color: #c6c;">255</span> <span style="color: #c6c;">255</span> <span style="color: #c6c;">255</span><span style="color: #6c6;">&#41;</span> data <span style="color: #6c6;">&#40;</span>x, y<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>set the palette <span style="color: #06c; font-weight: bold;">for</span> <span style="color: #c6c;">8</span><span style="color: #a52a2a;">-</span>bit colour mode<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> setPalette file <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> <span style="color: #6c6;">&#40;</span>palette <span style="color: #a52a2a;">:</span> IntPtr<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>getPalette<span style="color: #6c6;">&#40;</span>file<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> colours <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #a52a2a;">|</span>0<span style="color: #a52a2a;">..</span>255<span style="color: #a52a2a;">|</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html"><span style="color: #06c; font-weight: bold;">Array</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">map</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> i <span style="color: #a52a2a;">-&gt;</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">for</span> i <span style="color: #06c; font-weight: bold;">in</span> <span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span>255<span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; colours<span style="color: #a52a2a;">.</span><span style="color: #6c6;">&#91;</span>i<span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">&lt;-</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">PtrToStructure</span><span style="color: #6c6;">&#40;</span>palette, typeof<span style="color: #a52a2a;">&lt;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; palette <span style="color: #a52a2a;">&lt;-</span> IntPtr<span style="color: #6c6;">&#40;</span>palette<span style="color: #a52a2a;">.</span><span style="color: #060;">ToInt32</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">+</span> sizeof<span style="color: #a52a2a;">&lt;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Color</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_SetPalette</span><span style="color: #6c6;">&#40;</span>sdlScreen, <span style="color: #6c6;">&#40;</span>int<span style="color: #6c6;">&#41;</span> <span style="color: #6c6;">&#40;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_LOGPAL</span> <span style="color: #a52a2a;">|||</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_PHYSPAL</span><span style="color: #6c6;">&#41;</span>, colours, <span style="color: #c6c;">0</span>, <span style="color: #c6c;">256</span><span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span><span style="color: #06c; font-weight: bold;">function</span> <span style="color: #06c; font-weight: bold;">to</span> show the frames per second <span style="color: #06c; font-weight: bold;">in</span> top left corner<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> internal timer <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">new</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">Diagnostics</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Stopwatch</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal milliseconds <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span>int64 <span style="color: #c6c;">0</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal frames <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span><br />
<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #06c; font-weight: bold;">mutable</span> internal fps <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">0</span><br />
<br />
<span style="color: #06c; font-weight: bold;">let</span> internal showfps <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;frames <span style="color: #a52a2a;">&lt;-</span> frames <span style="color: #a52a2a;">+</span> <span style="color: #c6c;">1</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">if</span> timer<span style="color: #a52a2a;">.</span><span style="color: #060;">ElapsedMilliseconds</span> <span style="color: #a52a2a;">&gt;</span> milliseconds <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; fps <span style="color: #a52a2a;">&lt;-</span> frames<br />
&nbsp; &nbsp; &nbsp; milliseconds <span style="color: #a52a2a;">&lt;-</span> timer<span style="color: #a52a2a;">.</span><span style="color: #060;">ElapsedMilliseconds</span> <span style="color: #a52a2a;">+</span> <span style="color: #6c6;">&#40;</span>int64 <span style="color: #c6c;">1000</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; frames <span style="color: #a52a2a;">&lt;-</span> <span style="color: #c6c;">0</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey fps <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">10</span>, <span style="color: #c6c;">0</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;writey <span style="color: #3cb371;">&quot;fps&quot;</span> <span style="color: #6c6;">&#40;</span><span style="color: #c6c;">40</span>, <span style="color: #c6c;">0</span><span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>convert keyboard scancodes <span style="color: #06c; font-weight: bold;">to</span> helpfull key string<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> scancodeToKey sc <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_GetKeyName</span><span style="color: #6c6;">&#40;</span>sc<span style="color: #6c6;">&#41;</span> <br />
<br />
<br />
<span style="color: #a52a2a;">//</span>draw monad<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">type</span> DrawMonad<span style="color: #6c6;">&#40;</span>name<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Delay</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> drawfire <span style="color: #6c6;">&#40;</span>Draw <span style="color: #6c6;">&#40;</span>name, f<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Zero</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> draw <span style="color: #a52a2a;">=</span> DrawMonad<span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;draw&quot;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> drawn name <span style="color: #a52a2a;">=</span> DrawMonad<span style="color: #6c6;">&#40;</span>name<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>event monad<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">type</span> EventMonad<span style="color: #6c6;">&#40;</span>evnt<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Delay</span><span style="color: #6c6;">&#40;</span>f<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp; &nbsp; events <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> e <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> x <span style="color: #06c; font-weight: bold;">when</span> x <span style="color: #a52a2a;">=</span> evnt <span style="color: #a52a2a;">-&gt;</span> f<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;member this<span style="color: #a52a2a;">.</span><span style="color: #060;">Zero</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #06c; font-weight: bold;">let</span> onevent e <span style="color: #a52a2a;">=</span> EventMonad<span style="color: #6c6;">&#40;</span>e<span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>clear the screen<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> cls <span style="color: #6c6;">&#40;</span>str <span style="color: #a52a2a;">:</span> obj<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> str <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> <span style="color: #a52a2a;">:</span>? string <span style="color: #a52a2a;">-&gt;</span> drawfire <span style="color: #6c6;">&#40;</span>UnDraw <span style="color: #6c6;">&#40;</span>str <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> string<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> drawfire <span style="color: #6c6;">&#40;</span>UnDraw <span style="color: #3cb371;">&quot;draw&quot;</span><span style="color: #6c6;">&#41;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>start the sdl program loop <span style="color: #06c; font-weight: bold;">in</span> a seperate thread<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> internal sdlloop <span style="color: #a52a2a;">=</span> async <span style="color: #6c6;">&#123;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> _ <span style="color: #a52a2a;">=</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Init</span><span style="color: #6c6;">&#40;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_INIT_VIDEO</span> <span style="color: #a52a2a;">|||</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_INIT_JOYSTICK</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span>screen <span style="color: #a52a2a;">:</span> IntPtr<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> sdlFullScreen <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">true</span> <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_SetVideoMode</span><span style="color: #6c6;">&#40;</span>sdlWidth, sdlHeight, sdlDepth, Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_DOUBLEBUF</span> <span style="color: #a52a2a;">|||</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_HWPALETTE</span> <span style="color: #a52a2a;">|||</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_FULLSCREEN</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_SetVideoMode</span><span style="color: #6c6;">&#40;</span>sdlWidth, sdlHeight, sdlDepth, Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_DOUBLEBUF</span> <span style="color: #a52a2a;">|||</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_HWPALETTE</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>get ponter <span style="color: #06c; font-weight: bold;">to</span> video memory from sdl <span style="color: #06c; font-weight: bold;">and</span> pass it <span style="color: #06c; font-weight: bold;">to</span> pcxf library<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> <span style="color: #6c6;">&#40;</span>surface <span style="color: #a52a2a;">:</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Surface</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#40;</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">PtrToStructure</span><span style="color: #6c6;">&#40;</span>screen, typeof<span style="color: #a52a2a;">&lt;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Surface</span><span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">:</span>?<span style="color: #a52a2a;">&gt;</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Surface</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> buffer <span style="color: #a52a2a;">=</span> surface<span style="color: #a52a2a;">.</span><span style="color: #060;">pixels</span><br />
&nbsp; &nbsp;sdlBuffer <span style="color: #a52a2a;">&lt;-</span> buffer<br />
&nbsp; &nbsp;sdlScreen <span style="color: #a52a2a;">&lt;-</span> screen<br />
&nbsp; &nbsp;setScreen<span style="color: #6c6;">&#40;</span>buffer, sdlWidth, sdlHeight, sdlDepth<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;loadFonts<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span><span style="color: #06c; font-weight: bold;">open</span> <span style="color: #06c; font-weight: bold;">and</span> set palette <span style="color: #06c; font-weight: bold;">if</span> <span style="color: #c6c;">8</span><span style="color: #a52a2a;">-</span>bit colour is being used<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">if</span> sdlDepth <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">8</span> <span style="color: #06c; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">try</span> <span style="color: #6c6;">&#91;</span><span style="color: #3cb371;">&quot;/usr/local/share/libpcxf/palette.gpl&quot;</span><span style="color: #a52a2a;">;</span> <span style="color: #3cb371;">&quot;/usr/share/libpcxf/palette.gpl&quot;</span><span style="color: #a52a2a;">;</span> <span style="color: #3cb371;">&quot;palette.gpl&quot;</span><span style="color: #6c6;">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">find</span> System<span style="color: #a52a2a;">.</span><span style="color: #060;">IO</span><span style="color: #a52a2a;">.</span><span style="color: #060;">File</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Exists</span> <span style="color: #a52a2a;">|&gt;</span> setPalette <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a> <span style="color: #06c; font-weight: bold;">with</span> <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span><span style="color: #06c; font-weight: bold;">open</span> any joysticks that are plugged <span style="color: #06c; font-weight: bold;">in</span><span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> _ <span style="color: #a52a2a;">=</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_JoystickEventState</span><span style="color: #6c6;">&#40;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_ENABLE</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">for</span> i <span style="color: #06c; font-weight: bold;">in</span> <span style="color: #6c6;">&#91;</span>0<span style="color: #a52a2a;">..</span><span style="color: #060;">Sdl</span><span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_NumJoysticks</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-</span> <span style="color: #c6c;">1</span><span style="color: #6c6;">&#93;</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">let</span> _ <span style="color: #a52a2a;">=</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_JoystickOpen</span><span style="color: #6c6;">&#40;</span>i<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>create arrays <span style="color: #06c; font-weight: bold;">of</span> black <span style="color: #06c; font-weight: bold;">for</span> clearing the screen<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> empty8 <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html"><span style="color: #06c; font-weight: bold;">Array</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">create</span> <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span> 0uy<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> empty16 <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html"><span style="color: #06c; font-weight: bold;">Array</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">create</span> <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span> 0s<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> empty32 <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Array.html"><span style="color: #06c; font-weight: bold;">Array</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">create</span> <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span> <span style="color: #c6c;">0</span><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>sdl event loop<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> event <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> <span style="color: #6c6;">&#40;</span>Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Event</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> running <span style="color: #a52a2a;">=</span> <span style="color: #06c; font-weight: bold;">ref</span> <span style="color: #c6c;">1</span><br />
&nbsp; &nbsp;timer<span style="color: #a52a2a;">.</span><span style="color: #060;">Start</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">while</span> <span style="color: #a52a2a;">!</span>running <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">while</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_PollEvent</span><span style="color: #6c6;">&#40;</span>event<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> GetEventType<span style="color: #a52a2a;">.</span><span style="color: #060;">Get</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_KEYDOWN</span> <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>KeyDown <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">key</span><span style="color: #a52a2a;">.</span><span style="color: #060;">keysym</span><span style="color: #a52a2a;">.</span><span style="color: #060;">sym</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_KEYUP</span> <span style="color: #a52a2a;">-&gt;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">if</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">key</span><span style="color: #a52a2a;">.</span><span style="color: #060;">keysym</span><span style="color: #a52a2a;">.</span><span style="color: #060;">sym</span> <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">27</span> <span style="color: #06c; font-weight: bold;">then</span> running <span style="color: #a52a2a;">:=</span> <span style="color: #c6c;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sdlFire <span style="color: #6c6;">&#40;</span>KeyUp <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">key</span><span style="color: #a52a2a;">.</span><span style="color: #060;">keysym</span><span style="color: #a52a2a;">.</span><span style="color: #060;">sym</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_MOUSEMOTION</span> <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>MouseMove <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">motion</span><span style="color: #a52a2a;">.</span><span style="color: #060;">x</span><span style="color: #6c6;">&#41;</span>,int <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">motion</span><span style="color: #a52a2a;">.</span><span style="color: #060;">y</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_MOUSEBUTTONDOWN</span> <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>MouseDown <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_MOUSEBUTTONUP</span> <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>MouseUp <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_JOYAXISMOTION</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jaxis</span><span style="color: #a52a2a;">.</span><span style="color: #060;">which</span> <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> 0uy <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>JoyAxis1 <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jaxis</span><span style="color: #a52a2a;">.</span><span style="color: #060;">axis</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span>GetJaxisValue<span style="color: #a52a2a;">.</span><span style="color: #060;">Get</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> 1uy <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>JoyAxis2 <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jaxis</span><span style="color: #a52a2a;">.</span><span style="color: #060;">axis</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span>, <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span>GetJaxisValue<span style="color: #a52a2a;">.</span><span style="color: #060;">Get</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;SdlSimple only supports 2 joysticks at present. (this is easy to fix)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_JOYBUTTONDOWN</span> <span style="color: #a52a2a;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jbutton</span><span style="color: #a52a2a;">.</span><span style="color: #060;">which</span> <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> 0uy <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>JoyButtonDown1 <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jbutton</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> 1uy <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>JoyButtonDown2 <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jbutton</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;SdlSimple only supports 2 joysticks at present. (this is easy to fix)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_JOYBUTTONUP</span> <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">match</span> <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jbutton</span><span style="color: #a52a2a;">.</span><span style="color: #060;">which</span> <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> 0uy <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>JoyButtonUp1 <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jbutton</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> 1uy <span style="color: #a52a2a;">-&gt;</span> sdlFire <span style="color: #6c6;">&#40;</span>JoyButtonUp2 <span style="color: #6c6;">&#40;</span>int <span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">!</span>event<span style="color: #6c6;">&#41;</span><span style="color: #a52a2a;">.</span><span style="color: #060;">jbutton</span><span style="color: #a52a2a;">.</span><span style="color: #060;">button</span><span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;SdlSimple only supports 2 joysticks at present. (this is easy to fix)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_MUSTLOCK</span><span style="color: #6c6;">&#40;</span>sdlScreen<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="color: #06c; font-weight: bold;">do</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_LockSurface</span><span style="color: #6c6;">&#40;</span>sdlScreen<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">//</span>clear the screen<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> sdlDepth <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> <span style="color: #c6c;">8</span> <span style="color: #a52a2a;">-&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">Copy</span><span style="color: #6c6;">&#40;</span>empty8, <span style="color: #c6c;">0</span>, buffer, <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> <span style="color: #c6c;">16</span> <span style="color: #a52a2a;">-&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">Copy</span><span style="color: #6c6;">&#40;</span>empty16, <span style="color: #c6c;">0</span>, buffer, <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> <span style="color: #c6c;">24</span> <span style="color: #a52a2a;">-&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">Copy</span><span style="color: #6c6;">&#40;</span>empty16, <span style="color: #c6c;">0</span>, buffer, <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> <span style="color: #c6c;">32</span> <span style="color: #a52a2a;">-&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html"><span style="color: #06c; font-weight: bold;">Marshal</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">Copy</span><span style="color: #6c6;">&#40;</span>empty32, <span style="color: #c6c;">0</span>, buffer, <span style="color: #6c6;">&#40;</span>sdlWidth <span style="color: #a52a2a;">*</span> sdlHeight<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #06c; font-weight: bold;">failwith</span> <span style="color: #3cb371;">&quot;not a valid bit depth.&quot;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">for</span> <span style="color: #6c6;">&#40;</span>s, e<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">in</span> drawevents <span style="color: #06c; font-weight: bold;">do</span> e<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>perform all draw events<span style="color: #a52a2a;">.</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">if</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_MUSTLOCK</span><span style="color: #6c6;">&#40;</span>sdlScreen<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">=</span> <span style="color: #c6c;">1</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="color: #06c; font-weight: bold;">do</span> Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_UnlockSurface</span><span style="color: #6c6;">&#40;</span>sdlScreen<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><br />
&nbsp; &nbsp; &nbsp; Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Flip</span><span style="color: #6c6;">&#40;</span>sdlScreen<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALignore"><span style="color: #06c; font-weight: bold;">ignore</span></a><br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>clean up<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;println <span style="color: #3cb371;">&quot;done.&quot;</span><br />
&nbsp; &nbsp;timer<span style="color: #a52a2a;">.</span><span style="color: #060;">Stop</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;unloadFonts<span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;Sdl<span style="color: #a52a2a;">.</span><span style="color: #060;">SDL_Quit</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
<span style="color: #6c6;">&#125;</span><br />
<br />
<br />
<span style="color: #a52a2a;">//</span>setup sdl <span style="color: #06c; font-weight: bold;">and</span> various things<span style="color: #a52a2a;">:</span><br />
<span style="color: #06c; font-weight: bold;">let</span> SdlSimpleSetup width height depth fs <span style="color: #a52a2a;">=</span><br />
<br />
&nbsp; &nbsp;sdlHeight <span style="color: #a52a2a;">&lt;-</span> height<br />
&nbsp; &nbsp;sdlWidth <span style="color: #a52a2a;">&lt;-</span> width<br />
&nbsp; &nbsp;sdlDepth <span style="color: #a52a2a;">&lt;-</span> <span style="color: #06c; font-weight: bold;">try</span> <span style="color: #6c6;">&#91;</span><span style="color: #c6c;">8</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">16</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">24</span><span style="color: #a52a2a;">;</span><span style="color: #c6c;">32</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">find</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#40;</span><span style="color: #a52a2a;">=</span><span style="color: #6c6;">&#41;</span> depth<span style="color: #6c6;">&#41;</span> <span style="color: #06c; font-weight: bold;">with</span> <span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> <span style="color: #c6c;">32</span><br />
&nbsp; &nbsp;sdlFullScreen <span style="color: #a52a2a;">&lt;-</span> fs<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>create events <span style="color: #06c; font-weight: bold;">for</span> sdl events <span style="color: #06c; font-weight: bold;">and</span> draw events<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> fire, evs <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">create</span><span style="color: #a52a2a;">&lt;</span>sdlevent<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;sdlFire <span style="color: #a52a2a;">&lt;-</span> fire<br />
&nbsp; &nbsp;events <span style="color: #a52a2a;">&lt;-</span> evs<br />
&nbsp; &nbsp;<span style="color: #06c; font-weight: bold;">let</span> dfire, draw <span style="color: #a52a2a;">=</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">create</span><span style="color: #a52a2a;">&lt;</span>sdldraw<span style="color: #a52a2a;">&gt;</span><span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;drawfire <span style="color: #a52a2a;">&lt;-</span> dfire<br />
<br />
&nbsp; &nbsp;<span style="color: #a52a2a;">//</span>listen <span style="color: #06c; font-weight: bold;">for</span> draw events <span style="color: #06c; font-weight: bold;">and</span> add<span style="color: #a52a2a;">/</span>delete them from the drawevents list<span style="color: #a52a2a;">:</span><br />
&nbsp; &nbsp;draw <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Event.html"><span style="color: #06c; font-weight: bold;">Event</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">listen</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> e <span style="color: #a52a2a;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #06c; font-weight: bold;">match</span> e <span style="color: #06c; font-weight: bold;">with</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> Draw <span style="color: #6c6;">&#40;</span>s, e<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> drawevents <span style="color: #a52a2a;">&lt;-</span> drawevents @ <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#40;</span>s, e<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #a52a2a;">|</span> UnDraw x <span style="color: #a52a2a;">|</span> Erase x <span style="color: #a52a2a;">-&gt;</span> drawevents <span style="color: #a52a2a;">&lt;-</span> drawevents <span style="color: #a52a2a;">|&gt;</span> <a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html"><span style="color: #06c; font-weight: bold;">List</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">filter</span> <span style="color: #6c6;">&#40;</span><span style="color: #06c; font-weight: bold;">fun</span> <span style="color: #6c6;">&#40;</span>s, e<span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">-&gt;</span> s <span style="color: #a52a2a;">&lt;&gt;</span> x<span style="color: #6c6;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #6c6;">&#41;</span><br />
<br />
&nbsp; &nbsp;drawfire <span style="color: #6c6;">&#40;</span>Draw <span style="color: #6c6;">&#40;</span><span style="color: #3cb371;">&quot;fps&quot;</span>, showfps<span style="color: #6c6;">&#41;</span><span style="color: #6c6;">&#41;</span> <span style="color: #a52a2a;">//</span>add showfps <span style="color: #06c; font-weight: bold;">function</span> <span style="color: #06c; font-weight: bold;">to</span> drawevents list<span style="color: #a52a2a;">.</span><br />
<br />
&nbsp; &nbsp;<span style="color: #060;">Async</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Spawn</span> sdlloop <span style="color: #a52a2a;">//</span>spawn the sdl program loop <span style="color: #06c; font-weight: bold;">in</span> a seperate thread<span style="color: #a52a2a;">.</span><br />
<br />
&nbsp; &nbsp;<span style="color: #060;">System</span><span style="color: #a52a2a;">.</span><span style="color: #060;">Threading</span><span style="color: #a52a2a;">.</span><a href="http://caml.inria.fr/pub/docs/manual-ocaml/libref/Thread.html"><span style="color: #06c; font-weight: bold;">Thread</span></a><span style="color: #a52a2a;">.</span><span style="color: #060;">Sleep</span> <span style="color: #c6c;">500</span><br />
&nbsp;</div><br />
<br />
]]></description>
 <category>f#</category>
<comments>http://blog.turbofriendship.comindex.php?itemid=14</comments>
 <pubDate>Fri, 20 Feb 2009 04:19:02 +0000</pubDate>
</item>
  </channel>
</rss>