Commits

David Barker  committed a0590d7

Wrote up WPF integration (though source still needs to be added)

  • Participants
  • Parent commits 3636952

Comments (0)

Files changed (21)

File Dissertation/Dissertation.aux

 \@writefile{toc}{\contentsline {paragraph}{Binding to lists}{24}}
 \@writefile{lol}{\contentsline {lstlisting}{\numberline {3.4}Explicitly reassigning a list to trigger a binding update}{24}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {3.3.4}Integration work with WPF}{24}}
-\@writefile{toc}{\contentsline {chapter}{\numberline {4}Evaluation}{25}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3.8}{\ignorespaces The WPF integration demo -- the progress bar goes sinusoidally up and down}}{25}}
+\newlabel{fig:wpf_integration_demo}{{3.8}{25}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {4}Evaluation}{27}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
-\@writefile{toc}{\contentsline {section}{\numberline {4.1}Correctness of arrow implementations}{25}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.1}Automated testing}{25}}
-\@writefile{toc}{\contentsline {subsubsection}{Simple arrows}{26}}
-\@writefile{toc}{\contentsline {subsubsection}{Invertible arrows}{26}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.2}Correctness proof by decomposing into lambda calculus}{26}}
-\@writefile{toc}{\contentsline {section}{\numberline {4.2}Syntax evaluation}{27}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.1}Arrow syntax}{27}}
-\@writefile{toc}{\contentsline {subsubsection}{Comparison with Haskell}{27}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.2}Binding syntax}{27}}
-\@writefile{toc}{\contentsline {subsubsection}{Username two-way binding}{27}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces The username two-way binding application}}{28}}
-\newlabel{fig:case_study_name}{{4.1}{28}}
-\@writefile{toc}{\contentsline {subsubsection}{List binding from a mock database}{29}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces The list binding application}}{29}}
-\newlabel{fig:case_study_list}{{4.2}{29}}
-\@writefile{toc}{\contentsline {subsubsection}{Some other demo}{30}}
-\@writefile{toc}{\contentsline {section}{\numberline {4.3}Performance testing}{30}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.1}Arrow performance}{30}}
-\@writefile{toc}{\contentsline {subsubsection}{Measuring technique}{30}}
-\@writefile{toc}{\contentsline {subsubsection}{Simple function results}{31}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces Performance of arrows, Funcs and normal functions in implementing simple functionality}}{32}}
-\newlabel{fig:simple_function_performance}{{4.3}{32}}
-\@writefile{toc}{\contentsline {subsubsection}{List function results}{32}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.4}{\ignorespaces Performance of arrows, Linq queries and normal (loop-based) functions in implementing simple list functionality}}{33}}
-\newlabel{fig:list_function_performance}{{4.4}{33}}
-\@writefile{toc}{\contentsline {subsubsection}{Overhead due to arrow chaining}{34}}
-\newlabel{sec:arrow_chaining_overhead}{{4.3.1}{34}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces Execution times of chains of identity functions}}{34}}
-\newlabel{fig:arrow_chaining_overhead}{{4.5}{34}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.2}Binding performance}{34}}
-\@writefile{toc}{\contentsline {chapter}{\numberline {5}Conclusion}{35}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.1}Correctness of arrow implementations}{27}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.1}Automated testing}{27}}
+\@writefile{toc}{\contentsline {subsubsection}{Simple arrows}{28}}
+\@writefile{toc}{\contentsline {subsubsection}{Invertible arrows}{28}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.2}Correctness proof by decomposing into lambda calculus}{28}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.2}Syntax evaluation}{29}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.1}Arrow syntax}{29}}
+\@writefile{toc}{\contentsline {subsubsection}{Comparison with Haskell}{29}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.2}Binding syntax}{29}}
+\@writefile{toc}{\contentsline {subsubsection}{Username two-way binding}{29}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces The username two-way binding application}}{30}}
+\newlabel{fig:case_study_name}{{4.1}{30}}
+\@writefile{toc}{\contentsline {subsubsection}{List binding from a mock database}{31}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces The list binding application}}{31}}
+\newlabel{fig:case_study_list}{{4.2}{31}}
+\@writefile{toc}{\contentsline {subsubsection}{Some other demo}{32}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.3}Performance testing}{32}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.1}Arrow performance}{32}}
+\@writefile{toc}{\contentsline {subsubsection}{Measuring technique}{32}}
+\@writefile{toc}{\contentsline {subsubsection}{Simple function results}{33}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces Performance of arrows, Funcs and normal functions in implementing simple functionality}}{34}}
+\newlabel{fig:simple_function_performance}{{4.3}{34}}
+\@writefile{toc}{\contentsline {subsubsection}{List function results}{34}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.4}{\ignorespaces Performance of arrows, Linq queries and normal (loop-based) functions in implementing simple list functionality}}{35}}
+\newlabel{fig:list_function_performance}{{4.4}{35}}
+\@writefile{toc}{\contentsline {subsubsection}{Overhead due to arrow chaining}{36}}
+\newlabel{sec:arrow_chaining_overhead}{{4.3.1}{36}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces Execution times of chains of identity functions}}{36}}
+\newlabel{fig:arrow_chaining_overhead}{{4.5}{36}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.2}Binding performance}{36}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {5}Conclusion}{37}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
-\@writefile{toc}{\contentsline {section}{\numberline {5.1}Future work}{35}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {5.1.1}Performance enhancements}{35}}
-\newlabel{sec:performance_enhancements}{{5.1.1}{35}}
-\@writefile{toc}{\contentsline {chapter}{\numberline {A}Arrow laws}{37}}
+\@writefile{toc}{\contentsline {section}{\numberline {5.1}Future work}{37}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.1.1}Performance enhancements}{37}}
+\newlabel{sec:performance_enhancements}{{5.1.1}{37}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {A}Arrow laws}{39}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
-\newlabel{sec:arrow_laws}{{A}{37}}
-\@writefile{toc}{\contentsline {section}{\numberline {A.1}Normal arrow laws}{37}}
-\newlabel{sec:simle_arrow_laws}{{A.1}{37}}
-\@writefile{toc}{\contentsline {section}{\numberline {A.2}Invertible arrow laws}{38}}
-\newlabel{sec:invertible_arrow_laws}{{A.2}{38}}
-\@writefile{toc}{\contentsline {chapter}{\numberline {B}Code samples for case studies}{39}}
+\newlabel{sec:arrow_laws}{{A}{39}}
+\@writefile{toc}{\contentsline {section}{\numberline {A.1}Normal arrow laws}{39}}
+\newlabel{sec:simle_arrow_laws}{{A.1}{39}}
+\@writefile{toc}{\contentsline {section}{\numberline {A.2}Invertible arrow laws}{40}}
+\newlabel{sec:invertible_arrow_laws}{{A.2}{40}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {B}WPF integration demo -- code listings}{41}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
-\newlabel{sec:case_studies}{{B}{39}}
-\@writefile{toc}{\contentsline {section}{\numberline {B.1}Username two-way binding}{39}}
-\newlabel{sec:case_study_name}{{B.1}{39}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {B.1.1}Creating the bindable data source}{39}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {B.1.2}Creating the functionality for splitting the name}{40}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {B.1.3}Creating the binding}{41}}
-\@writefile{toc}{\contentsline {section}{\numberline {B.2}List binding from a mock database}{43}}
-\newlabel{sec:case_study_list}{{B.2}{43}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {B.2.1}Creating the bindable `database'}{43}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {B.2.2}Filtering and mapping the list}{43}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {B.2.3}Creating the binding}{44}}
-\@writefile{toc}{\contentsline {section}{\numberline {B.3}Some other demo}{45}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {C}Code samples for case studies}{43}}
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{sec:case_studies}{{C}{43}}
+\@writefile{toc}{\contentsline {section}{\numberline {C.1}Username two-way binding}{43}}
+\newlabel{sec:case_study_name}{{C.1}{43}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {C.1.1}Creating the bindable data source}{43}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {C.1.2}Creating the functionality for splitting the name}{44}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {C.1.3}Creating the binding}{45}}
+\@writefile{toc}{\contentsline {section}{\numberline {C.2}List binding from a mock database}{47}}
+\newlabel{sec:case_study_list}{{C.2}{47}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {C.2.1}Creating the bindable `database'}{47}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {C.2.2}Filtering and mapping the list}{47}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {C.2.3}Creating the binding}{48}}
+\@writefile{toc}{\contentsline {section}{\numberline {C.3}Some other demo}{49}}
 \citation{arrow_calculus}
 \citation{hughes_arrows}
 \citation{arrows_robots_frp}

File Dissertation/Dissertation.lof

 \contentsline {figure}{\numberline {3.5}{\ignorespaces Correspondence between Haskell and C$\sharp $ arrow operators}}{13}
 \contentsline {figure}{\numberline {3.6}{\ignorespaces Overview of the binding method}}{17}
 \contentsline {figure}{\numberline {3.7}{\ignorespaces Marshalling a list of BindPoint sources to pass to an arrow and unmarshalling the result}}{23}
+\contentsline {figure}{\numberline {3.8}{\ignorespaces The WPF integration demo -- the progress bar goes sinusoidally up and down}}{25}
+\addvspace {10\p@ }
+\contentsline {figure}{\numberline {4.1}{\ignorespaces The username two-way binding application}}{30}
+\contentsline {figure}{\numberline {4.2}{\ignorespaces The list binding application}}{31}
+\contentsline {figure}{\numberline {4.3}{\ignorespaces Performance of arrows, Funcs and normal functions in implementing simple functionality}}{34}
+\contentsline {figure}{\numberline {4.4}{\ignorespaces Performance of arrows, Linq queries and normal (loop-based) functions in implementing simple list functionality}}{35}
+\contentsline {figure}{\numberline {4.5}{\ignorespaces Execution times of chains of identity functions}}{36}
 \addvspace {10\p@ }
-\contentsline {figure}{\numberline {4.1}{\ignorespaces The username two-way binding application}}{28}
-\contentsline {figure}{\numberline {4.2}{\ignorespaces The list binding application}}{29}
-\contentsline {figure}{\numberline {4.3}{\ignorespaces Performance of arrows, Funcs and normal functions in implementing simple functionality}}{32}
-\contentsline {figure}{\numberline {4.4}{\ignorespaces Performance of arrows, Linq queries and normal (loop-based) functions in implementing simple list functionality}}{33}
-\contentsline {figure}{\numberline {4.5}{\ignorespaces Execution times of chains of identity functions}}{34}
 \addvspace {10\p@ }
 \addvspace {10\p@ }
 \addvspace {10\p@ }

File Dissertation/Dissertation.log

-This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9 64-bit) (preloaded format=pdflatex 2012.10.5)  28 APR 2013 13:29
+This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9 64-bit) (preloaded format=pdflatex 2012.10.5)  28 APR 2013 14:51
 entering extended mode
 **Dissertation.tex
 
 (pdftex.def)             Requested size: 411.93877pt x 119.07281pt.
  [23 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
 sertation/fig/ArgumentMarshalling.pdf>]
-[24]
-Chapter 4.
-[25
+[24] <fig/WPFIntegrationDemo.png, id=196, 571.13374pt x 203.76125pt>
+File: fig/WPFIntegrationDemo.png Graphic file (type png)
+
+<use fig/WPFIntegrationDemo.png>
+Package pdftex.def Info: fig/WPFIntegrationDemo.png used on input line 552.
+(pdftex.def)             Requested size: 411.93877pt x 146.96603pt.
+ [25 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
+sertation/fig/WPFIntegrationDemo.png>] [26
 
+]
+Chapter 4.
+[27
 
-] [26] <fig/CaseStudyNameBinding.png, id=203, 283.0575pt x 210.7875pt>
+] [28] <fig/CaseStudyNameBinding.png, id=211, 283.0575pt x 210.7875pt>
 File: fig/CaseStudyNameBinding.png Graphic file (type png)
 
 <use fig/CaseStudyNameBinding.png>
-Package pdftex.def Info: fig/CaseStudyNameBinding.png used on input line 612.
+Package pdftex.def Info: fig/CaseStudyNameBinding.png used on input line 623.
 (pdftex.def)             Requested size: 283.0568pt x 210.78699pt.
- [27] [28 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBindin
+ [29] [30 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBindin
 g/Dissertation/fig/CaseStudyNameBinding.png>] <fig/CaseStudyListBinding.png, id
-=211, 596.2275pt x 423.5825pt>
+=218, 596.2275pt x 423.5825pt>
 File: fig/CaseStudyListBinding.png Graphic file (type png)
 
 <use fig/CaseStudyListBinding.png>
-Package pdftex.def Info: fig/CaseStudyListBinding.png used on input line 633.
+Package pdftex.def Info: fig/CaseStudyListBinding.png used on input line 644.
 (pdftex.def)             Requested size: 411.93877pt x 292.66003pt.
- [29 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
+ [31 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
 sertation/fig/CaseStudyListBinding.png>]
-[30] [31]
-<fig/SimpleFunctionPerformanceChart.pdf, id=221, 496.44887pt x 258.75552pt>
+[32] [33]
+<fig/SimpleFunctionPerformanceChart.pdf, id=229, 496.44887pt x 258.75552pt>
 File: fig/SimpleFunctionPerformanceChart.pdf Graphic file (type pdf)
 
 <use fig/SimpleFunctionPerformanceChart.pdf>
 Package pdftex.def Info: fig/SimpleFunctionPerformanceChart.pdf used on input l
-ine 691.
+ine 702.
 (pdftex.def)             Requested size: 411.93877pt x 214.71175pt.
- [32 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
+ [34 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
 sertation/fig/SimpleFunctionPerformanceChart.pdf>]
-<fig/ListFunctionPerformanceChart.pdf, id=295, 496.4172pt x 244.72725pt>
+<fig/ListFunctionPerformanceChart.pdf, id=303, 496.4172pt x 244.72725pt>
 File: fig/ListFunctionPerformanceChart.pdf Graphic file (type pdf)
 
 <use fig/ListFunctionPerformanceChart.pdf>
 Package pdftex.def Info: fig/ListFunctionPerformanceChart.pdf used on input lin
-e 710.
+e 721.
 (pdftex.def)             Requested size: 411.93877pt x 203.08247pt.
- [33 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
-sertation/fig/ListFunctionPerformanceChart.pdf>] <fig/IdentityChains.pdf, id=36
-4, 496.51498pt x 216.57913pt>
+ [35 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
+sertation/fig/ListFunctionPerformanceChart.pdf>] <fig/IdentityChains.pdf, id=37
+1, 496.51498pt x 216.57913pt>
 File: fig/IdentityChains.pdf Graphic file (type pdf)
 
 <use fig/IdentityChains.pdf>
-Package pdftex.def Info: fig/IdentityChains.pdf used on input line 724.
+Package pdftex.def Info: fig/IdentityChains.pdf used on input line 735.
 (pdftex.def)             Requested size: 411.93877pt x 179.69122pt.
- [34 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
+ [36 <C:/Users/David/Documents/Visual Studio 2010/Projects/ArrowDataBinding/Dis
 sertation/fig/IdentityChains.pdf>]
 Chapter 5.
-[35
+[37
 
 
-] [36
+] [38
 
 ]
 Appendix A.
-[37
+[39
 
-] [38]
+] [40]
 Appendix B.
+[41
+
+
+] [42
+
+]
+Appendix C.
 \pc@column@1=\box29
 \pc@column@width@1=\dimen119
 \pc@column@2=\box30
 \pc@column@width@2=\dimen120
 Package parcolumns Info: Width of column 1 calculated as 194.2195pt on input li
-ne 831.
+ne 849.
 Package parcolumns Info: Width of column 2 calculated as 194.2195pt on input li
-ne 831.
-[39
-
+ne 849.
+[43
 
 ]
 Package parcolumns Info: Width of column 1 calculated as 194.2195pt on input li
-ne 886.
+ne 904.
 Package parcolumns Info: Width of column 2 calculated as 194.2195pt on input li
-ne 886.
- [40]
+ne 904.
+ [44]
 Package parcolumns Info: Width of column 1 calculated as 194.2195pt on input li
-ne 931.
+ne 949.
 Package parcolumns Info: Width of column 2 calculated as 194.2195pt on input li
-ne 931.
- [41] [42]
+ne 949.
+ [45] [46]
 Package parcolumns Info: Width of column 1 calculated as 194.2195pt on input li
-ne 973.
+ne 991.
 Package parcolumns Info: Width of column 2 calculated as 194.2195pt on input li
-ne 973.
- [43
+ne 991.
+ [47
 
 ]
 Package parcolumns Info: Width of column 1 calculated as 194.2195pt on input li
-ne 1015.
+ne 1033.
 Package parcolumns Info: Width of column 2 calculated as 194.2195pt on input li
-ne 1015.
- [44] [45
+ne 1033.
+ [48] [49
 
-] [46
+] [50
 
 ]
 ("C:\Users\David\Documents\Visual Studio 2010\Projects\ArrowDataBinding\Dissert
 a-tion.
  []
 
-[47
+[51
 
-]) [48]
+]) [52]
 ("C:\Users\David\Documents\Visual Studio 2010\Projects\ArrowDataBinding\Dissert
 ation\Dissertation.aux") ) 
 Here is how much of TeX's memory you used:
- 2926 strings out of 494045
- 43033 string characters out of 3148387
+ 2932 strings out of 494045
+ 43204 string characters out of 3148387
  216622 words of memory out of 3000000
- 6197 multiletter control sequences out of 15000+200000
+ 6202 multiletter control sequences out of 15000+200000
  12938 words of font info for 46 fonts, out of 3000000 for 9000
  715 hyphenation exceptions out of 8191
  27i,8n,40p,1132b,1520s stack positions out of 5000i,500n,10000p,200000b,50000s
 ogram Files/MiKTeX 2.9/fonts/type1/public/amsfonts/cm/cmtt10.pfb><C:/Program Fi
 les/MiKTeX 2.9/fonts/type1/public/amsfonts/cm/cmtt12.pfb><C:/Program Files/MiKT
 eX 2.9/fonts/type1/public/amsfonts/cm/cmtt8.pfb>
-Output written on Dissertation.pdf (58 pages, 521897 bytes).
+Output written on Dissertation.pdf (62 pages, 552457 bytes).
 PDF statistics:
- 605 PDF objects out of 1000 (max. 8388607)
+ 619 PDF objects out of 1000 (max. 8388607)
  0 named destinations out of 1000 (max. 500000)
- 56 words of extra memory for PDF output out of 10000 (max. 10000000)
+ 61 words of extra memory for PDF output out of 10000 (max. 10000000)
 

File Dissertation/Dissertation.pdf

Binary file modified.

File Dissertation/Dissertation.synctex.gz

Binary file modified.

File Dissertation/Dissertation.tex

 \subsection{Integration work with WPF}
 
 %Mention difficulties with the value converter and inability to properly integrate it into XAML and stuff.
-Todo
+As the standard WPF binding method is fairly widely-used and naturally compatible with WPF, it was decided that arrows should be made compatible with it. WPF's standard approach to binding through a function is by creating a class extending the \texttt{IValueConverter} interface which implements the desired functionality through its \texttt{Convert} and \texttt{ConvertBack} methods. It was therefore reasonably simple to implement a value converter which allowed an arrow to be used for the conversion. However, this cannot be used when defining bindings in XAML as it does not allow constructor parameters to be passed in (it is possible to \textit{set} parameters in XAML, but this is a clunky workaround and the application would crash if the arrow was left unset). Creating WPF bindings with arrows is therefore limited to the code-behind.
+
+One area where WPF integration went particularly well is in removing the boilerplate usually required to make a source bindable. In general, the programmer has to set up an event to be triggered when the bound variable changes and override the setters of all bound variables so that they throw this event. The method throwing the event also has to pass in the name of the variable triggering it (for disambiguation) and ensure that the event is not null (which occurs when it has no subscribers). This is usually combined with a method which stores variables' old values and checks that they have actually changed to avoid redundant updates. I was able to extract all this functionality into the \texttt{Bindable} base class and the PostSharp aspect, thus removing all the standard boilerplate. Variables can now be made bindable simply by making their class extend \texttt{Bindable} and placing the \texttt{[Bindable]} tag above them.
+
+To demonstrate the WPF integration, a simple demo application was made in which a constantly incrementing 'time' variable is bound through a sin function to a progress bar. This is pictured in Figure \ref{fig:wpf_integration_demo}, and the main source code listings can be found in [Appendix].
+
+\begin{figure}[!ht]
+  \centering
+  \includegraphics[width=\textwidth]{fig/WPFIntegrationDemo.png}
+  \caption{The WPF integration demo -- the progress bar goes sinusoidally up and down}
+  \label{fig:wpf_integration_demo}
+\end{figure}
 
 \cleardoublepage
 
 \cleardoublepage
 
 
+\chapter{WPF integration demo -- code listings}
+
+To be done
+
+\cleardoublepage
+
+
 \chapter{Code samples for case studies} \label{sec:case_studies}
 
 \section{Username two-way binding} \label{sec:case_study_name}

File Dissertation/Dissertation.toc

 \contentsline {paragraph}{Type safety}{23}
 \contentsline {paragraph}{Binding to lists}{24}
 \contentsline {subsection}{\numberline {3.3.4}Integration work with WPF}{24}
-\contentsline {chapter}{\numberline {4}Evaluation}{25}
-\contentsline {section}{\numberline {4.1}Correctness of arrow implementations}{25}
-\contentsline {subsection}{\numberline {4.1.1}Automated testing}{25}
-\contentsline {subsubsection}{Simple arrows}{26}
-\contentsline {subsubsection}{Invertible arrows}{26}
-\contentsline {subsection}{\numberline {4.1.2}Correctness proof by decomposing into lambda calculus}{26}
-\contentsline {section}{\numberline {4.2}Syntax evaluation}{27}
-\contentsline {subsection}{\numberline {4.2.1}Arrow syntax}{27}
-\contentsline {subsubsection}{Comparison with Haskell}{27}
-\contentsline {subsection}{\numberline {4.2.2}Binding syntax}{27}
-\contentsline {subsubsection}{Username two-way binding}{27}
-\contentsline {subsubsection}{List binding from a mock database}{29}
-\contentsline {subsubsection}{Some other demo}{30}
-\contentsline {section}{\numberline {4.3}Performance testing}{30}
-\contentsline {subsection}{\numberline {4.3.1}Arrow performance}{30}
-\contentsline {subsubsection}{Measuring technique}{30}
-\contentsline {subsubsection}{Simple function results}{31}
-\contentsline {subsubsection}{List function results}{32}
-\contentsline {subsubsection}{Overhead due to arrow chaining}{34}
-\contentsline {subsection}{\numberline {4.3.2}Binding performance}{34}
-\contentsline {chapter}{\numberline {5}Conclusion}{35}
-\contentsline {section}{\numberline {5.1}Future work}{35}
-\contentsline {subsection}{\numberline {5.1.1}Performance enhancements}{35}
-\contentsline {chapter}{\numberline {A}Arrow laws}{37}
-\contentsline {section}{\numberline {A.1}Normal arrow laws}{37}
-\contentsline {section}{\numberline {A.2}Invertible arrow laws}{38}
-\contentsline {chapter}{\numberline {B}Code samples for case studies}{39}
-\contentsline {section}{\numberline {B.1}Username two-way binding}{39}
-\contentsline {subsection}{\numberline {B.1.1}Creating the bindable data source}{39}
-\contentsline {subsection}{\numberline {B.1.2}Creating the functionality for splitting the name}{40}
-\contentsline {subsection}{\numberline {B.1.3}Creating the binding}{41}
-\contentsline {section}{\numberline {B.2}List binding from a mock database}{43}
-\contentsline {subsection}{\numberline {B.2.1}Creating the bindable `database'}{43}
-\contentsline {subsection}{\numberline {B.2.2}Filtering and mapping the list}{43}
-\contentsline {subsection}{\numberline {B.2.3}Creating the binding}{44}
-\contentsline {section}{\numberline {B.3}Some other demo}{45}
+\contentsline {chapter}{\numberline {4}Evaluation}{27}
+\contentsline {section}{\numberline {4.1}Correctness of arrow implementations}{27}
+\contentsline {subsection}{\numberline {4.1.1}Automated testing}{27}
+\contentsline {subsubsection}{Simple arrows}{28}
+\contentsline {subsubsection}{Invertible arrows}{28}
+\contentsline {subsection}{\numberline {4.1.2}Correctness proof by decomposing into lambda calculus}{28}
+\contentsline {section}{\numberline {4.2}Syntax evaluation}{29}
+\contentsline {subsection}{\numberline {4.2.1}Arrow syntax}{29}
+\contentsline {subsubsection}{Comparison with Haskell}{29}
+\contentsline {subsection}{\numberline {4.2.2}Binding syntax}{29}
+\contentsline {subsubsection}{Username two-way binding}{29}
+\contentsline {subsubsection}{List binding from a mock database}{31}
+\contentsline {subsubsection}{Some other demo}{32}
+\contentsline {section}{\numberline {4.3}Performance testing}{32}
+\contentsline {subsection}{\numberline {4.3.1}Arrow performance}{32}
+\contentsline {subsubsection}{Measuring technique}{32}
+\contentsline {subsubsection}{Simple function results}{33}
+\contentsline {subsubsection}{List function results}{34}
+\contentsline {subsubsection}{Overhead due to arrow chaining}{36}
+\contentsline {subsection}{\numberline {4.3.2}Binding performance}{36}
+\contentsline {chapter}{\numberline {5}Conclusion}{37}
+\contentsline {section}{\numberline {5.1}Future work}{37}
+\contentsline {subsection}{\numberline {5.1.1}Performance enhancements}{37}
+\contentsline {chapter}{\numberline {A}Arrow laws}{39}
+\contentsline {section}{\numberline {A.1}Normal arrow laws}{39}
+\contentsline {section}{\numberline {A.2}Invertible arrow laws}{40}
+\contentsline {chapter}{\numberline {B}WPF integration demo -- code listings}{41}
+\contentsline {chapter}{\numberline {C}Code samples for case studies}{43}
+\contentsline {section}{\numberline {C.1}Username two-way binding}{43}
+\contentsline {subsection}{\numberline {C.1.1}Creating the bindable data source}{43}
+\contentsline {subsection}{\numberline {C.1.2}Creating the functionality for splitting the name}{44}
+\contentsline {subsection}{\numberline {C.1.3}Creating the binding}{45}
+\contentsline {section}{\numberline {C.2}List binding from a mock database}{47}
+\contentsline {subsection}{\numberline {C.2.1}Creating the bindable `database'}{47}
+\contentsline {subsection}{\numberline {C.2.2}Filtering and mapping the list}{47}
+\contentsline {subsection}{\numberline {C.2.3}Creating the binding}{48}
+\contentsline {section}{\numberline {C.3}Some other demo}{49}

File Dissertation/fig/WPFIntegrationDemo.png

Added
New image

File Dissertation/fig/WPFIntegrationDemoText.png

Added
New image

File WPFIntegrationDemo/MainWindow.xaml

         Title="MainWindow" Height="350" Width="525">
     <Grid>
         <TextBlock x:Name="TextBox" HorizontalAlignment="Left" Margin="23,27,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="48" Width="458"/>
+        <ProgressBar x:Name="Progress" HorizontalAlignment="Left" Height="40" Margin="23,80,0,0" VerticalAlignment="Top" Width="450"/>
 
     </Grid>
 </Window>

File WPFIntegrationDemo/MainWindow.xaml.cs

 {
     public partial class MainWindow : Window
     {
+        private Arrow<int, double> progressArrow;
         private Arrow<int, string> arrow;
         private Time time;
 
         {
             InitializeComponent();
             InitialiseTime();
-            InitialiseArrow();
-            InitialiseBinding();
+            InitialiseArrows();
+            InitialiseBindings();
         }
 
         public void InitialiseTime()
             time = new Time();
         }
 
-        public void InitialiseArrow()
+        public void InitialiseArrows()
         {
-            var sinArrow = Op.Arr((int x) => 50 + (int)(50.0*Math.Sin(x / 30.0)));
-            var textSizeArrow = Op.Arr((int length) => new String('|', length));
+            progressArrow = Op.Arr((int x) => 50.0 + (50.0*Math.Sin(x / 30.0)));
+            var sinArrow = progressArrow.Combine(Op.Arr((double x) => (int)x));
+            var textSizeArrow = Op.Arr((int length) => new String('☺', length));
             arrow = sinArrow.Combine(textSizeArrow);
         }
 
-        public void InitialiseBinding()
+        public void InitialiseBindings()
+        {
+            InitialiseTextBinding();
+            InitialiseProgressBarBinding();
+        }
+
+        public void InitialiseTextBinding()
         {
             Binding binding = new Binding();
             binding.Source = time;
             binding.Converter = new ArrowValueConverter(arrow);
             TextBox.SetBinding(TextBlock.TextProperty, binding);
         }
+
+        public void InitialiseProgressBarBinding()
+        {
+            Binding binding = new Binding();
+            binding.Source = time;
+            binding.Mode = BindingMode.OneWay;
+            binding.Path = new PropertyPath("CurrentTime");
+            binding.Converter = new ArrowValueConverter(progressArrow);
+            Progress.SetBinding(ProgressBar.ValueProperty, binding);
+        }
     }
 
     public class Time : Bindable

File WPFIntegrationDemo/bin/Debug/WPFIntegrationDemo.exe

Binary file modified.

File WPFIntegrationDemo/bin/Debug/WPFIntegrationDemo.pdb

Binary file modified.

File WPFIntegrationDemo/obj/Debug/Before-PostSharp/WPFIntegrationDemo.exe

Binary file modified.

File WPFIntegrationDemo/obj/Debug/Before-PostSharp/WPFIntegrationDemo.pdb

Binary file modified.

File WPFIntegrationDemo/obj/Debug/MainWindow.baml

Binary file modified.

File WPFIntegrationDemo/obj/Debug/MainWindow.g.cs

-#pragma checksum "..\..\MainWindow.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "E912D3ABC58A5455120A48A933BB441A"
+#pragma checksum "..\..\MainWindow.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "C499077D5D8E96CEBBCE355D8D68CBA3"
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
         #line default
         #line hidden
         
+        
+        #line 7 "..\..\MainWindow.xaml"
+        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+        internal System.Windows.Controls.ProgressBar Progress;
+        
+        #line default
+        #line hidden
+        
         private bool _contentLoaded;
         
         /// <summary>
             case 1:
             this.TextBox = ((System.Windows.Controls.TextBlock)(target));
             return;
+            case 2:
+            this.Progress = ((System.Windows.Controls.ProgressBar)(target));
+            return;
             }
             this._contentLoaded = true;
         }

File WPFIntegrationDemo/obj/Debug/MainWindow.g.i.cs

-#pragma checksum "..\..\MainWindow.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "E912D3ABC58A5455120A48A933BB441A"
+#pragma checksum "..\..\MainWindow.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "C499077D5D8E96CEBBCE355D8D68CBA3"
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
         #line default
         #line hidden
         
+        
+        #line 7 "..\..\MainWindow.xaml"
+        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+        internal System.Windows.Controls.ProgressBar Progress;
+        
+        #line default
+        #line hidden
+        
         private bool _contentLoaded;
         
         /// <summary>
             case 1:
             this.TextBox = ((System.Windows.Controls.TextBlock)(target));
             return;
+            case 2:
+            this.Progress = ((System.Windows.Controls.ProgressBar)(target));
+            return;
             }
             this._contentLoaded = true;
         }

File WPFIntegrationDemo/obj/Debug/WPFIntegrationDemo.exe

Binary file modified.

File WPFIntegrationDemo/obj/Debug/WPFIntegrationDemo.g.resources

Binary file modified.

File WPFIntegrationDemo/obj/Debug/WPFIntegrationDemo.pdb

Binary file modified.