(** We have a library made of several modules:

   - module [Info]
   - module [Aggregate]
   - module [Chemical_group]
   - module [Backbone_link]
*)
(** We want to abstract our library upon the basic [Info] module:
    we want to be able to define several instances of the library using
    variation of the [Info] module.
    Hence we need a functor [Make_lib_frames] which, given an [Info] module
    creates a [lib_frames] library.

    Something along the lines of:

module Make_Lib_frames (AInfo : INFO) : sig

  module Info : INFO with type info = AInfo.info
  ;;

  module Aggregate : sig

    type site = {
      path : path;
      info : Info.info;
    }
    ;;

    val free_site : path -> site
    ;;

    val print_site : Format.formatter -> site -> unit
    ;;

    val link : site -> site -> site
    ;;

  end
  ;;

  module Chemical_group : sig

    val double_site : Aggregate.site -> Aggregate.site
    ;;

  end
  ;;

  module Backbone_link : sig

    type backbone_link = private {
      n : Aggregate.site;
      p : path;
    }
    ;;

    val make : Aggregate.site -> path -> backbone_link
    ;;

  end
  ;;

end
;;
*)

