--- THINGS TO DO ---

BUGS
* I think the problem is here, in harmonize-addresses.ml:
    let _ =
      let read_tbl =
        let fixup_header s =
          (* This is pretty inefficient!! *)
          let lines = Util.splitIntoWords s '\n' in
  if I understand the following correctly (in ubase/util.ml):
    let splitIntoWords (s:string) (c:char) =
      let rec inword acc start pos =
        if pos >= String.length(s) || s.[pos] = c then
          betweenwords ((String.sub s start (pos-start)) :: acc) pos
        else inword acc start (pos+1)
      and betweenwords acc pos =
        if pos >= (String.length s) then (Safelist.rev acc)
        else if s.[pos]=c then betweenwords acc (pos+1)
        else inword acc pos pos
      in betweenwords [] 0
  consecutive separators are just dismissed. The "correct" implementation 
  may be:
    let splitIntoWords (s:string) (c:char) =
      let rec inword acc start pos =
        if pos >= String.length(s) || s.[pos] = c then
          betweenwords ((String.sub s start (pos-start)) :: acc) pos
        else inword acc start (pos+1)
      and betweenwords acc pos =
        if pos >= (String.length s) then (Safelist.rev acc)
        else if s.[pos]=c then betweenwords (""::acc) (pos+1)
        else inword acc pos pos
      in betweenwords [] 0
  but then I have a weird "List.combine error".
* The line 
    <?xml version="1.0" encoding="UTF-8"?>
  at the beginning of a plist file causes an error in PXP
  ===> Check if this is still the case; if so, email Gerd(?)
* Try running harmonize-addresses with empty args -- bad error mesg!
* Bug: in structured text demo, try completely emptying a replica
* why does - not work as an output file for csv (but works for meta, e.g.)?

FOCAL PROGRAMMING / DEMOS
** Get bookmark (and ical) demo ready for export and put them out on the
   harmony webpage
** Make it possible to run Harmony in "check" mode from the web interface
* more of the demos should display the sync output
* Dicts in plists should be represented unordered, not as lists
* move Thang's general concat into List module
* change the structured text lens so that it adds dummy headers all the
  time [bcp]

UNISON INTEGRATION
* make Unison permit missing archives (after confirming that it's OK)
* check for bad unison behavior
    make conflicting changes to todo.txt
    run unison/harmony twice
    note that second time no differences are reported!
  ==> Recheck and fix

SMALL IMPROVEMENTS
*** make front end interpret a plain .fcl file as a check command
*** some of the options (logfile, addprefsto) don't make sense for Harmony
    and should be suppressed
* make native assert function take a string arg

TIDYING
*** make sure GPL/whatever is stated correctly for external modules
* put LGPL notice in all files

LENSES
* new primitive:  hoistAny (which acts like hoist except that it doesn't
                    care what name the edge it's clipping out has; takes a
                    default name for the put case)
   also hoist becomes hoist_unique
* think about / implement / write down 
     swap
     join-all
     swap_consecutive_kids   
     swap_immediate_kids   [Nate]
* remove iter in favor of primitive fold_left (or reverse)  [Nate]

SYNC ALGORITHM
** Improve printing of everything, especially list sync  [bcp]
* memoize equality checks  (probably useful at some point, but not 
  high priority)

THINGS TO THINK ABOUT LATER
* Check "Set-Oriented Transformers," Srivastava, DBPL 2001
* Contact Doug Terry and Make Dahlin (UT Austin) and check out their current
  related research.  

DEMO IDEAS
* bibtex (XML only!); 
* group calendar 
