Hi, I figured that I would announce a library that I have been working on for a while now.
It's called Hafni, and it's a swing wrapper. Why another swing wrapper? I wanted to solve the following problems: 1. There are a lot of boilerplate code needed. 2. Changes made to content is not very functional. 3. Changing content is (sometimes) annoyingly hard. To solve these problems, I looked into the very functional world of Haskell and found something called Functional reactive programming (FRP)[1][2] which has been used to solve problem 2 in gui programming for Haskell. To be able to program FRP, the datatype "arrow" was created (or maybe the other way around), and this is what Hafni uses. I wont go into detail here since it is not very easy to explain in a short mail, and there are a lot of resources out there on the subject (see the links). To be honest, when I first started programming on Hafni, I didn't know that there existed other swing wrappers for java (I guess I also wanted to try this myself, which meant that I didn't really search it out), but since they do exist, lets compare Hafni to the two I have seen on this mailing list: seesaw [3] and GUIFTW [4]. 1. Hafni is strictly a swing wrapper and does not claim to be anything else. Seesaw - aims to provide a ui library, "It happens to be built on Swing". GUIFTW - "It's not tied to any GUI toolkit but instead front-ends for each can be written easily." 2. Hafni has facilities, but is not really interested in exactly how components look. Seesaw - Doesn't really express an opinion about this, but seems to have a lot of facilities for making components look a certain way. GUIFTW - "Style it in a CSS fashion" 3. When events happen, Hafni uses the "Event" and "arrow" datatypes to make things happen while both seesaw and GUIFTW uses something that looks like the standard java event function(s). It should be noted that Hafni event/arrows behaves exactly like corresponding for seesaw and GUIFTW if no changes is made to content. The reason of 2 (which, in a way, leads to 3) is that when I wrote swing code manually, the parts that I were most annoyed with weren't to make things look as I wanted them, it was changing them. I haven't really looked into it exactly (or tried it), but it looks like seesaw and Hafni can be combined since seesaw deals directly with java objects (the "config!" function is especially interesting) [5]. I would like to end this mail with an example of Hafni. This example is the same as in the Hafni readme. (frame :content (comp-and-events (button :text "*") :act (flow (output-arr this :text) >>> (arr #(str % "*")) >>> (input-arr this :text))) :size 200 200 :dont_exit_on_close) As it's already explained in the readme, let's look at the most interesting part: (flow (output-arr this :text) >>> (arr #(str % "*")) >>> (input-arr this :text)) This code snippet says that the current text of the button created with (button :text "*") should "flow" to the function #(str % "*") which adds a "*" to the text, which should flow to the text of that same button. The result of this is that when the button is pressed, the text of that button is changed as follows: "*" "**" "***" "****" etc ... And finally, the link to Hafni: https://github.com/odyssomay/Hafni ___________________ I really hope that someone finds this project interesting, and at best even useful. ;) Questions, comments, ideas, critique? Jonathan 1. http://en.wikipedia.org/wiki/Functional_reactive_programming 2. http://www.haskell.org/haskellwiki/Functional_Reactive_Programming 3. https://github.com/daveray/seesaw 4. https://github.com/santamon/GUIFTW 5. http://daveray.github.com/seesaw/seesaw.core-api.html#seesaw.core/config! Additional links: http://www.haskell.org/haskellwiki/Arrow http://en.wikibooks.org/wiki/Haskell/Understanding_arrows http://www.haskell.org/arrows/ -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en