Skip to content

Commit e462128

Browse files
authored
Create an ocamlorg.global library (#943)
* Create ocamlorg.global library Directory: src/global Library Module Name: Ocamlorg Library Dependency Name: ocamlorg.global Submodules: - Import - Url The goal of this library is to group in a single place stuff used across several libraries and have a single place for extending Stdlib. --------- Co-authored-by: Cuihtlauac ALVARADO <[email protected]>
1 parent 84082aa commit e462128

File tree

21 files changed

+203
-261
lines changed

21 files changed

+203
-261
lines changed

src/dream_dashboard/dune

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
(name dream_dashboard)
33
(public_name ocamlorg.dream-dashboard)
44
(libraries
5+
ocamlorg.global
56
dream
67
hyper
78
yojson

src/dream_dashboard/import.ml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
1-
module List = struct
2-
include Stdlib.List
3-
4-
let take n xs =
5-
let rec aux i acc = function
6-
| [] -> acc
7-
| _ when i = 0 -> acc
8-
| y :: ys -> aux (i - 1) (y :: acc) ys
9-
in
10-
aux n [] xs |> List.rev
11-
end
12-
131
module Result = struct
142
include Stdlib.Result
153

src/dream_dashboard/template/analytics_template.eml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
open Import
1+
open Ocamlorg.Import
22

33
let render ~prefix (events : Event.t list) =
44
Layout_template.render ~prefix ~title:"Analytics" ~nav:Analytics @@

src/global/dune

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
(library
2+
(name ocamlorg)
3+
(public_name ocamlorg.global))

tool/ood-gen/lib/import.ml renamed to src/global/import.ml

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
module String = struct
22
include Stdlib.String
33

4+
let contains_s s1 s2 =
5+
try
6+
let len = String.length s2 in
7+
for i = 0 to String.length s1 - len do
8+
if String.sub s1 i len = s2 then raise Exit
9+
done;
10+
false
11+
with Exit -> true
12+
413
let prefix s len = try sub s 0 len with Invalid_argument _ -> ""
514

615
(* ripped off stringext, itself ripping it off from one of dbuenzli's libs *)
@@ -44,35 +53,53 @@ module String = struct
4453
(sub s 0 (left_end + 1), sub s right_start (s_max - right_start + 1))
4554
end
4655

47-
module Glob = struct
48-
(* From https://github.com/simonjbeaumont/ocaml-glob *)
56+
module List = struct
57+
include Stdlib.List
4958

50-
(** Returns list of indices of occurances of substr in x *)
51-
let find_substrings ?(start_point = 0) substr x =
52-
let len_s = String.length substr and len_x = String.length x in
53-
let rec aux acc i =
54-
if len_x - i < len_s then acc
55-
else if String.sub x i len_s = substr then aux (i :: acc) (i + 1)
56-
else aux acc (i + 1)
57-
in
58-
aux [] start_point
59+
let rec take n = function
60+
| _ when n = 0 -> []
61+
| [] -> []
62+
| hd :: tl -> hd :: take (n - 1) tl
5963

60-
let matches_glob ~glob x =
61-
let rec contains_all_sections = function
62-
| _, [] | _, [ "" ] -> true
63-
| i, [ g ] ->
64-
(* need to find a match that matches to end of string *)
65-
find_substrings ~start_point:i g x
66-
|> List.exists (fun j -> j + String.length g = String.length x)
67-
| 0, "" :: g :: gs ->
68-
find_substrings g x
69-
|> List.exists (fun j ->
70-
contains_all_sections (j + String.length g, gs))
71-
| i, g :: gs ->
72-
find_substrings ~start_point:i g x
73-
|> List.exists (fun j ->
74-
(if i = 0 then j = 0 else true)
75-
&& contains_all_sections (j + String.length g, gs))
64+
let skip n xs =
65+
let rec aux i = function
66+
| [] -> []
67+
| l when i = 0 -> l
68+
| _ :: ys -> aux (i - 1) ys
7669
in
77-
contains_all_sections (0, String.split_on_char '*' glob)
70+
aux n xs
71+
end
72+
73+
module String_map = Map.Make (String)
74+
75+
module Acc_biggest (Elt : sig
76+
type t
77+
78+
val compare : t -> t -> int
79+
end) : sig
80+
(** Accumulate the [n] bigger elements given to [acc]. *)
81+
82+
type elt = Elt.t
83+
type t
84+
85+
val make : int -> t
86+
val acc : elt -> t -> t
87+
val to_list : t -> elt list
88+
end = struct
89+
type elt = Elt.t
90+
type t = int * elt list
91+
92+
let make size = (size, [])
93+
94+
(* Insert sort is enough. *)
95+
let rec insert_sort elt = function
96+
| [] -> [ elt ]
97+
| hd :: _ as t when Elt.compare hd elt >= 0 -> elt :: t
98+
| hd :: tl -> hd :: insert_sort elt tl
99+
100+
let acc elt (rem, elts) =
101+
let elts = insert_sort elt elts in
102+
if rem = 0 then (0, List.tl elts) else (rem - 1, elts)
103+
104+
let to_list (_, elts) = elts
78105
end

src/global/url.ml

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
let index = "/"
2+
let packages = "/packages"
3+
let packages_search = "/packages/search"
4+
let packages_autocomplete_fragment = "/packages/autocomplete"
5+
let with_hash = Option.fold ~none:"/p" ~some:(( ^ ) "/u/")
6+
let package ?hash v = with_hash hash ^ "/" ^ v
7+
let package_docs v = "/p/" ^ v ^ "/doc"
8+
let with_version = Option.value ~default:"latest"
9+
10+
let package_with_version ?version ?hash v =
11+
with_hash hash ^ "/" ^ v ^ "/" ^ with_version version
12+
13+
let package_doc ?hash ?version ?(page = "index.html") v =
14+
with_hash hash ^ "/" ^ v ^ "/" ^ with_version version ^ "/doc/" ^ page
15+
16+
let community = "/community"
17+
let success_story v = "/success-stories/" ^ v
18+
let industrial_users = "/industrial-users"
19+
let academic_users = "/academic-users"
20+
let about = "/about"
21+
22+
let minor v =
23+
match String.split_on_char '.' v with
24+
| x :: y :: _ -> x ^ "." ^ y
25+
| _ -> invalid_arg (v ^ ": invalid OCaml version")
26+
27+
let v2 = "https://v2.ocaml.org"
28+
let manual_with_version v = v2 ^ "/releases/" ^ minor v ^ "/htmlman/index.html"
29+
let manual = "/releases/latest/manual.html"
30+
let api_with_version v = v2 ^ "/releases/" ^ minor v ^ "/api/index.html"
31+
let api = "/releases/latest/api/index.html"
32+
let books = "/books"
33+
let releases = "/releases"
34+
let release v = "/releases/" ^ v
35+
let workshops = "/workshops"
36+
let workshop v = "/workshops/" ^ v
37+
let blog = "/blog"
38+
let news = "/news"
39+
let news_post v = "/news/" ^ v
40+
let jobs = "/jobs"
41+
let carbon_footprint = "/policies/carbon-footprint"
42+
let privacy_policy = "/policies/privacy-policy"
43+
let governance = "/policies/governance"
44+
let code_of_conduct = "/policies/code-of-conduct"
45+
let playground = "/play"
46+
let papers = "/papers"
47+
let learn = "/docs"
48+
let platform = "/docs/platform"
49+
let ocaml_on_windows = "/docs/ocaml-on-windows"
50+
let tutorial name = "/docs/" ^ name
51+
let getting_started = tutorial "up-and-running"
52+
let best_practices = "/docs/best-practices"
53+
let problems = "/problems"
54+
let installer = "/install-platform.sh"
55+
56+
let github_installer =
57+
"https://github.com/tarides/ocaml-platform-installer/releases/latest/download/installer.sh"
58+
59+
let github_opam_file package_name package_version =
60+
Printf.sprintf
61+
"https://github.com/ocaml/opam-repository/blob/master/packages/%s/%s.%s/opam"
62+
package_name package_name package_version

src/ocamlorg_frontend/dune

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(library
22
(name ocamlorg_frontend)
3-
(libraries dream ood timedesc ocamlorg_static))
3+
(libraries ocamlorg.global dream ood timedesc ocamlorg_static))
44

55
(include_subdirs unqualified)
66

src/ocamlorg_frontend/ocamlorg_frontend.ml

Lines changed: 29 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,34 @@ module Package_breadcrumbs = Package_breadcrumbs
22
module Package_overview = Package_overview
33
module Navmap = Navmap
44
module Toc = Toc
5-
module Url = Url
65
include Package_intf
76

8-
let about () = About.render ()
9-
let academic_users users = Academic_users.render users
10-
let best_practices best_practices = Best_practices.render best_practices
11-
let books books = Books.render books
12-
let community ~workshops ~meetups = Community.render ~workshops ~meetups
13-
let workshop ~videos workshop = Workshop.render ~videos workshop
14-
let home () = Home.render ()
15-
16-
let industrial_users ~users ~success_stories =
17-
Industrial_users.render ~users ~success_stories
18-
19-
let learn ~papers ~release ~books = Learn.render ~papers ~release ~books
20-
let platform tools = Platform.render tools
21-
22-
let blog ~featured ~rss ~rss_page ~rss_pages_number ~news =
23-
Blog.render ~featured ~rss ~rss_page ~rss_pages_number ~news
24-
25-
let news ~page ~pages_number news = News.render ~page ~pages_number news
26-
let news_post news = News_post.render news
27-
let jobs ?location ~locations jobs = Jobs.render ?location ~locations jobs
28-
29-
let package_overview ~documentation_status ~readme ~readme_title ~dependencies
30-
~rev_dependencies ~conflicts ~homepages ~source ~changes_filename
31-
~license_filename package =
32-
Package_overview.render ~documentation_status ~readme ~readme_title
33-
~dependencies ~rev_dependencies ~conflicts ~homepages ~source
34-
~changes_filename ~license_filename package
35-
36-
let package_documentation ~path ~toc ~maptoc ~content package =
37-
Package_documentation.render ~path ~toc ~maptoc ~content package
38-
39-
let package_documentation_not_found ~is_latest_url ~path ~package =
40-
Package_documentation_not_found.render ~is_latest_url ~path ~package
41-
42-
let packages stats = Packages.render stats
43-
let packages_search ~total packages = Packages_search.render ~total packages
44-
45-
let packages_autocomplete_fragment packages =
46-
Packages_autocomplete_fragment.render packages
47-
48-
let papers ?search ~recommended_papers papers =
49-
Papers.render ?search ~recommended_papers papers
50-
51-
let problems problems = Problems.render problems
52-
let release release = Release.render release
53-
let releases ?search releases = Releases.render ?search releases
54-
let success_story success_story = Success_story.render success_story
55-
let tutorial tutorial ~canonical = Tutorial.render tutorial ~canonical
56-
57-
let page ~title ~description ~meta_title ~meta_description ~content ~canonical =
58-
Page.render ~title ~description ~meta_title ~meta_description ~content
59-
~canonical
60-
61-
let playground () = Playground.render ()
62-
let not_found () = Not_found.render ()
7+
let about = About.render
8+
let academic_users = Academic_users.render
9+
let best_practices = Best_practices.render
10+
let blog = Blog.render
11+
let books = Books.render
12+
let community = Community.render
13+
let home = Home.render
14+
let industrial_users = Industrial_users.render
15+
let jobs = Jobs.render
16+
let learn = Learn.render
17+
let news = News.render
18+
let news_post = News_post.render
19+
let not_found = Not_found.render
20+
let package_documentation_not_found = Package_documentation_not_found.render
21+
let package_documentation = Package_documentation.render
22+
let package_overview = Package_overview.render
23+
let packages_autocomplete_fragment = Packages_autocomplete_fragment.render
24+
let packages = Packages.render
25+
let packages_search = Packages_search.render
26+
let page = Page.render
27+
let papers = Papers.render
28+
let platform = Platform.render
29+
let playground = Playground.render
30+
let problems = Problems.render
31+
let release = Release.render
32+
let releases = Releases.render
33+
let success_story = Success_story.render
34+
let tutorial = Tutorial.render
35+
let workshop = Workshop.render

src/ocamlorg_frontend/url.ml

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1 @@
1-
let index = "/"
2-
let packages = "/packages"
3-
let packages_search = "/packages/search"
4-
let packages_autocomplete_fragment = "/packages/autocomplete"
5-
let with_hash = Option.fold ~none:"/p" ~some:(( ^ ) "/u/")
6-
let package ?hash v = with_hash hash ^ "/" ^ v
7-
let package_docs v = "/p/" ^ v ^ "/doc"
8-
let with_version = Option.value ~default:"latest"
9-
10-
let package_with_version ?version ?hash v =
11-
with_hash hash ^ "/" ^ v ^ "/" ^ with_version version
12-
13-
let package_doc ?hash ?version ?(page = "index.html") v =
14-
with_hash hash ^ "/" ^ v ^ "/" ^ with_version version ^ "/doc/" ^ page
15-
16-
let community = "/community"
17-
let success_story v = "/success-stories/" ^ v
18-
let industrial_users = "/industrial-users"
19-
let academic_users = "/academic-users"
20-
let about = "/about"
21-
22-
let minor v =
23-
match String.split_on_char '.' v with
24-
| x :: y :: _ -> x ^ "." ^ y
25-
| _ -> invalid_arg (v ^ ": invalid OCaml version")
26-
27-
let v2 = "https://v2.ocaml.org"
28-
let manual_with_version v = v2 ^ "/releases/" ^ minor v ^ "/htmlman/index.html"
29-
let manual = "/releases/latest/manual.html"
30-
let api_with_version v = v2 ^ "/releases/" ^ minor v ^ "/api/index.html"
31-
let api = "/releases/latest/api/index.html"
32-
let books = "/books"
33-
let releases = "/releases"
34-
let release v = "/releases/" ^ v
35-
let workshops = "/workshops"
36-
let workshop v = "/workshops/" ^ v
37-
let blog = "/blog"
38-
let news = "/news"
39-
let news_post v = "/news/" ^ v
40-
let jobs = "/jobs"
41-
let carbon_footprint = "/policies/carbon-footprint"
42-
let privacy_policy = "/policies/privacy-policy"
43-
let governance = "/policies/governance"
44-
let code_of_conduct = "/policies/code-of-conduct"
45-
let playground = "/play"
46-
let papers = "/papers"
47-
let learn = "/docs"
48-
let platform = "/docs/platform"
49-
let ocaml_on_windows = "/docs/ocaml-on-windows"
50-
let tutorial name = "/docs/" ^ name
51-
let getting_started = tutorial "up-and-running"
52-
let best_practices = "/docs/best-practices"
53-
let problems = "/problems"
54-
let installer = "/install-platform.sh"
55-
56-
let github_installer =
57-
"https://github.com/tarides/ocaml-platform-installer/releases/latest/download/installer.sh"
58-
59-
let github_opam_file package_name package_version =
60-
Printf.sprintf
61-
"https://github.com/ocaml/opam-repository/blob/master/packages/%s/%s.%s/opam"
62-
package_name package_name package_version
1+
include Ocamlorg.Url

src/ocamlorg_package/lib/dune

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(library
22
(name ocamlorg_package)
33
(libraries
4+
ocamlorg.global
45
opam-format
56
bos
67
fpath

0 commit comments

Comments
 (0)