<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>