Source file TableclothString.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
module Comparator = TableclothComparator
type t = string
include TableclothComparator.Make (struct
type nonrec t = t
let compare = compare
end)
let initialize length ~f = Base.List.init length ~f |> Base.String.of_char_list
let repeat t ~count = Base.List.init count ~f:(fun _ -> t) |> Base.String.concat
let from_char = Base.String.of_char
let from_array characters =
let open Base in
Array.to_list characters |> String.of_char_list
let from_list = Base.String.of_char_list
let length = String.length
let is_empty t = length t = 0
let get = Base.String.get
let get_at a ~index =
if index >= 0 && index < length a
then Some (Base.String.get a index)
else None
let ( .?[] ) (string : string) (index : int) : char option =
get_at string ~index
let uncons (s : string) : (char * string) option =
match s with
| "" ->
None
| s ->
Some (s.[0], String.sub s 1 (String.length s - 1))
let drop_left (s : string) ~(count : int) : string =
Base.String.drop_prefix s count
let drop_right (s : string) ~(count : int) : string =
Base.String.drop_suffix s count
let split t ~(on : string) : string list =
Str.split_delim (Str.regexp_string on) t
let starts_with t ~prefix = Base.String.is_prefix ~prefix t
let ends_with t ~suffix = Base.String.is_suffix ~suffix t
let to_lowercase (s : string) : string = String.lowercase_ascii s
let to_uppercase (s : string) : string = String.uppercase_ascii s
let uncapitalize (s : string) : string = String.uncapitalize_ascii s
let capitalize (s : string) : string = String.capitalize_ascii s
let is_capitalized (s : string) : bool = s = String.capitalize_ascii s
let includes t ~substring : bool = Base.String.is_substring t ~substring
let reverse = Base.String.rev
let slice ?(to_ = 0) str ~from = String.sub str from (to_ - from)
let index_of haystack needle =
Base.String.Search_pattern.index
~pos:0
~in_:haystack
(Base.String.Search_pattern.create needle)
let index_of_right haystack needle =
Base.String.Search_pattern.index_all
~may_overlap:false
~in_:haystack
(Base.String.Search_pattern.create needle)
|> Base.List.last
let insert_at t ~(index : int) ~(value : string) : string =
let length = length t in
let index = if index > length then length else index in
let index = if index < 0 then length + index else index in
let index = if index < 0 then 0 else index in
let start_count = index in
let end_count = length - index in
let start = drop_right ~count:end_count t in
let end_ = drop_left ~count:start_count t in
String.concat "" [ start; value; end_ ]
let to_array string = Base.String.to_list string |> Array.of_list
let to_list = Base.String.to_list
let trim string = Base.String.strip string
let trim_left string = Base.String.lstrip string
let trim_right string = Base.String.rstrip string
let pad_left string target_length ~with_ =
if length string >= target_length
then string
else
let padding_length = target_length - length string in
let count = padding_length / length with_ in
let padding = slice (repeat with_ ~count) ~from:0 ~to_:padding_length in
padding ^ string
let pad_right string target_length ~with_ =
if length string >= target_length
then string
else
let padding_length = target_length - length string in
let count = padding_length / length with_ in
let padding = slice (repeat with_ ~count) ~from:0 ~to_:padding_length in
string ^ padding
let pad_right = pad_right
let for_each = Base.String.iter
let fold s ~initial ~f = Base.String.fold s ~init:initial ~f
let equal = Base.String.equal
let compare = Base.String.compare