package tablecloth-base
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 148module 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 (* Handle overflow *) let index = if index > length then length else index in (* Negative is an index from the end *) let index = if index < 0 then length + index else index in (* Handle case where it's still less than zero *) 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