<br><br><div class="gmail_quote">2009/3/28 David Lutterkort <span dir="ltr"><<a href="mailto:lutter@redhat.com">lutter@redhat.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On Fri, 2009-03-27 at 22:51 +0100, Raphaël Pinson wrote:<br>
> As shared with David on IRC, I think we should go even more towards<br>
> sharing generic constructions in lenses to make writing lenses easier,<br>
> and adopt generic ways of implementing common patterns.<br>
><br>
> Here are some propositions already, taken from monit.aug and<br>
> exports.aug and how these two lenses can be simplified by using the<br>
> newly defined types :<br>
<br>
</div>I like that a lot, and it's a much needed cleanup. As we discussed on<br>
IRC, we should split Util into several modules, like Rx for commonly<br>
used regexps etc.<br>
<br>
I also want to get 0.5.0 out before we do this, simply since these<br>
library additions should not change too much once they've been released,<br>
and I feel we should be a little careful in figuring out what to factor<br>
where.<br>
<font color="#888888"></font></blockquote><div><br><br>Here is a first shot, applied to the previously changed files :<br><br><br>diff --git a/lenses/exports.aug b/lenses/exports.aug<br>index 499a3af..856e365 100644<br>--- a/lenses/exports.aug<br>
+++ b/lenses/exports.aug<br>@@ -78,19 +78,20 @@ module Exports =<br> <br> let client_re = /[a-zA-Z0-9\-\.@\*\?\/]+/<br> <br>- let eol = del /[ \t]*\n/ "\n"<br>+ let eol = Util.eol<br>+ let lbracket = Util.del_str "("<br>
+ let rbracket = Util.del_str ")"<br>+ let sep_com = Sep.comma<br>+ let sep_spc = Sep.space<br> <br> let option = [ label "option" . store /[^,)]+/ ]<br> <br>- let client = [ label "client" . store client_re .<br>
- ( Util.del_str "(" . <br>- option .<br>- ( Util.del_str "," . option ) * .<br>- Util.del_str ")" )? ]<br>
+ let client = [ label "client" . store client_re .<br>+ ( Build.brackets lbracket rbracket<br>+ ( Build.list option sep_com ) )? ]<br> <br>- let entry = [ label "dir" . store /\/[^ \t]*/ .<br>
- Util.del_ws_spc .<br>- client . (Util.del_ws_spc . client)* . eol ]<br>+ let entry = [ label "dir" . store /\/[^ \t]*/<br>+ . sep_spc . Build.list client sep_spc . eol ]<br>
<br> let lns = (Hosts.empty | Hosts.comment | entry)*<br> <br>diff --git a/lenses/fstab.aug b/lenses/fstab.aug<br>index 2246026..0a990db 100644<br>--- a/lenses/fstab.aug<br>+++ b/lenses/fstab.aug<br>@@ -3,17 +3,20 @@<br>
module Fstab =<br> autoload xfm<br> <br>- let sep_tab = Util.del_ws_tab<br>- let sep_spc = Util.del_ws_spc<br>- let comma = Util.del_str ","<br>- let eol = del /[ \t]*\n/ "\n"<br>+ let sep_tab = Sep.tab<br>
+ let sep_spc = Sep.space<br>+ let comma = Sep.comma<br>+ let eol = Util.eol<br> <br> let comment = Util.comment<br> let empty = Util.empty <br> <br>- let word = /[^,# \n\t]+/<br>+ let word = Rx.word<br>
+<br> let comma_sep_list (l:string) =<br>- [ label l . store word ] . ([comma . label l . store word])*<br>+ let lns = [ label l . store word ] in<br>+ Build.list lns comma<br>+<br> let record = [ seq "mntent" . <br>
[ label "spec" . store word ] . sep_tab .<br> [ label "file" . store word ] . sep_tab .<br>diff --git a/lenses/group.aug b/lenses/group.aug<br>index 26bfc61..288c2e2 100644<br>
--- a/lenses/group.aug<br>+++ b/lenses/group.aug<br>@@ -17,25 +17,24 @@ let eol = Util.eol<br> let comment = Util.comment<br> let empty = Util.empty<br> <br>-let colon = del ":" ":"<br>
-let comma = del "," ","<br>+let colon = Sep.colon<br>+let comma = Sep.comma<br> <br>-let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/<br>+let sto_to_spc = store Rx.space_in <br> <br>
-let word = /[A-Za-z0-9_.-]+/<br>-let integer = /[0-9]+/<br>+let word = Rx.word<br>+let integer = Rx.integer<br> <br> (************************************************************************<br> * ENTRIES<br>
*************************************************************************)<br> <br>-let user = [ label "user" . store word ]<br>-let entry = [ key word<br>- . colon<br>- . [ label "password" . store word . colon ]<br>
+let user = [ label "user" . store word ]<br>+let user_list = Build.list user comma<br>+let params = [ label "password" . store word . colon ]<br> . [ label "gid" . store integer . colon ]<br>
- . (user . (comma . user)*)?<br>- . eol ]<br>+ . user_list?<br>+let entry = Build.key_value_line word colon params<br> <br> (************************************************************************<br>
* LENS<br>diff --git a/lenses/monit.aug b/lenses/monit.aug<br>index bd4e63e..dde4573 100644<br>--- a/lenses/monit.aug<br>+++ b/lenses/monit.aug<br>@@ -33,29 +33,28 @@ module Monit =<br> * USEFUL PRIMITIVES<br>
*************************************************************************)<br> <br>-let eol = Util.eol<br>-let spc = Util.del_ws_spc<br>+let spc = Sep.space<br> let comment = Util.comment<br> let empty = Util.empty<br>
<br>-let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/<br>-let sto_to_spc = store /[^ \t\n]+/<br>+let sto_to_spc = store Rx.space_in<br>+let sto_no_spc = store Rx.no_spaces<br> <br>-let word = /[A-Za-z0-9_.-]+/<br>
-let value = [ key word . spc . sto_to_eol . eol ]<br>+let word = Rx.word<br>+let value = Build.key_value_line word spc sto_to_spc<br> <br> (************************************************************************<br>
* ENTRIES<br> *************************************************************************)<br> <br> (* set statement *)<br>-let set = [ key "set" . spc . value ]<br>+let set = Build.key_value "set" spc value<br>
<br> (* include statement *)<br>-let include = [ key "include" . spc . sto_to_eol . eol ]<br>+let include = Build.key_value_line "include" spc sto_to_spc<br> <br> (* service statement *)<br>-let service = [ key "check" . spc . value . (spc . value)+ ]<br>
+let service = Build.key_value "check" spc (Build.list value spc)<br> <br> let entry = (set|include|service)<br> <br><br><br>Raphaël<br><br></div></div><br>