@@ -57,32 +57,36 @@ defmodule String.Unicode do
57
57
58
58
# Downcase
59
59
60
- def downcase ( "" ) , do: ""
61
-
62
60
lc { codepoint , _upper , lower , _title } in list codes , lower && lower != codepoint do
63
- def downcase ( unquote ( codepoint ) <> rest ) do
64
- unquote ( lower ) <> downcase ( rest )
61
+ l = binary_to_list ( lower ) |> :lists . reverse
62
+
63
+ def downcase ( unquote ( codepoint ) <> rest , acc ) do
64
+ downcase ( rest , unquote ( l ) ++ acc )
65
65
end
66
66
end
67
67
68
- def downcase ( << char , rest :: binary >> ) do
69
- << char >> <> downcase ( rest )
68
+ def downcase ( << char , rest :: binary >> , acc ) do
69
+ downcase ( rest , [ char | acc ] )
70
70
end
71
71
72
- # Upcase
72
+ def downcase ( "" , acc ) , do: acc |> :lists . reverse |> list_to_binary
73
73
74
- def upcase ( "" ) , do: ""
74
+ # Upcase
75
75
76
76
lc { codepoint , upper , _lower , _title } in list codes , upper && upper != codepoint do
77
- def upcase ( unquote ( codepoint ) <> rest ) do
78
- unquote ( upper ) <> upcase ( rest )
77
+ u = binary_to_list ( upper ) |> :lists . reverse
78
+
79
+ def upcase ( unquote ( codepoint ) <> rest , acc ) do
80
+ upcase ( rest , unquote ( u ) ++ acc )
79
81
end
80
82
end
81
83
82
- def upcase ( << char , rest :: binary >> ) do
83
- << char >> <> upcase ( rest )
84
+ def upcase ( << char , rest :: binary >> , acc ) do
85
+ upcase ( rest , [ char | acc ] )
84
86
end
85
87
88
+ def upcase ( "" , acc ) , do: acc |> :lists . reverse |> list_to_binary
89
+
86
90
# Titlecase once
87
91
88
92
def titlecase_once ( "" ) , do: { "" , "" }
@@ -109,23 +113,27 @@ defmodule String.Unicode do
109
113
110
114
def lstrip ( other ) when is_binary ( other ) , do: other
111
115
112
- def rstrip ( "" ) , do: ""
113
-
114
116
def rstrip ( string ) when is_binary ( string ) do
115
- do_rstrip ( string , "" )
117
+ do_rstrip ( string , [ ] , [ ] )
116
118
end
117
119
118
120
lc codepoint inlist whitespace do
119
- defp do_rstrip ( unquote ( codepoint ) <> rest , buffer ) do
120
- do_rstrip ( rest , unquote ( codepoint ) <> buffer )
121
+ c = binary_to_list ( codepoint ) |> :lists . reverse
122
+
123
+ defp do_rstrip ( unquote ( codepoint ) <> rest , acc1 , acc2 ) do
124
+ do_rstrip ( rest , unquote ( c ) ++ ( acc1 || acc2 ) , acc2 )
121
125
end
122
126
end
123
127
124
- defp do_rstrip ( << char , rest :: binary >> , buffer ) do
125
- << buffer :: binary , char , do_rstrip ( rest , "" ) :: binary >>
128
+ defp do_rstrip ( << char , rest :: binary >> , nil , acc2 ) do
129
+ do_rstrip ( rest , nil , [ char | acc2 ] )
130
+ end
131
+
132
+ defp do_rstrip ( << char , rest :: binary >> , acc1 , _acc2 ) do
133
+ do_rstrip ( rest , nil , [ char | acc1 ] )
126
134
end
127
135
128
- defp do_rstrip ( << >> , _ ) , do: << >>
136
+ defp do_rstrip ( << >> , _acc1 , acc2 ) , do: acc2 |> :lists . reverse |> list_to_binary
129
137
130
138
# Split
131
139
0 commit comments