@@ -666,15 +666,15 @@ defmodule String do
666
666
667
667
defp replace_leading ( string , match , replacement , prefix_size , suffix_size , acc ) when suffix_size >= 0 do
668
668
case string do
669
- << prefix :: size ( prefix_size ) - binary , suffix :: size ( suffix_size ) - binary >> when prefix == match ->
669
+ << prefix :: size ( prefix_size ) - binary , suffix :: binary >> when prefix == match ->
670
670
replace_leading ( suffix , match , replacement , prefix_size , suffix_size - prefix_size , acc + 1 )
671
671
_ ->
672
- duplicate ( replacement , acc ) <> string
672
+ prepend_unless_empty ( duplicate ( replacement , acc ) , string )
673
673
end
674
674
end
675
675
676
676
defp replace_leading ( string , _match , replacement , _prefix_size , _suffix_size , acc ) do
677
- duplicate ( replacement , acc ) <> string
677
+ prepend_unless_empty ( duplicate ( replacement , acc ) , string )
678
678
end
679
679
680
680
@ doc """
@@ -714,15 +714,15 @@ defmodule String do
714
714
715
715
defp replace_trailing ( string , match , replacement , prefix_size , suffix_size , acc ) when prefix_size >= 0 do
716
716
case string do
717
- << prefix :: size ( prefix_size ) - binary , suffix :: size ( suffix_size ) - binary >> when suffix == match ->
717
+ << prefix :: size ( prefix_size ) - binary , suffix :: binary >> when suffix == match ->
718
718
replace_trailing ( prefix , match , replacement , prefix_size - suffix_size , suffix_size , acc + 1 )
719
719
_ ->
720
- string <> duplicate ( replacement , acc )
720
+ append_unless_empty ( string , duplicate ( replacement , acc ) )
721
721
end
722
722
end
723
723
724
724
defp replace_trailing ( string , _match , replacement , _prefix_size , _suffix_size , acc ) do
725
- string <> duplicate ( replacement , acc )
725
+ append_unless_empty ( string , duplicate ( replacement , acc ) )
726
726
end
727
727
728
728
@ doc """
@@ -755,11 +755,10 @@ defmodule String do
755
755
def replace_prefix ( string , match , replacement )
756
756
when is_binary ( string ) and is_binary ( match ) and is_binary ( replacement ) do
757
757
prefix_size = byte_size ( match )
758
- suffix_size = byte_size ( string ) - prefix_size
759
758
760
759
case string do
761
- << prefix :: size ( prefix_size ) - binary , suffix :: size ( suffix_size ) - binary >> when prefix == match ->
762
- replacement <> suffix
760
+ << prefix :: size ( prefix_size ) - binary , suffix :: binary >> when prefix == match ->
761
+ prepend_unless_empty ( replacement , suffix )
763
762
_ ->
764
763
string
765
764
end
@@ -798,13 +797,21 @@ defmodule String do
798
797
prefix_size = byte_size ( string ) - suffix_size
799
798
800
799
case string do
801
- << prefix :: size ( prefix_size ) - binary , suffix :: size ( suffix_size ) - binary >> when suffix == match ->
802
- prefix <> replacement
800
+ << prefix :: size ( prefix_size ) - binary , suffix :: binary >> when suffix == match ->
801
+ append_unless_empty ( prefix , replacement )
803
802
_ ->
804
803
string
805
804
end
806
805
end
807
806
807
+ @ compile { :inline , prepend_unless_empty: 2 , append_unless_empty: 2 }
808
+
809
+ defp prepend_unless_empty ( "" , suffix ) , do: suffix
810
+ defp prepend_unless_empty ( prefix , suffix ) , do: prefix <> suffix
811
+
812
+ defp append_unless_empty ( prefix , "" ) , do: prefix
813
+ defp append_unless_empty ( prefix , suffix ) , do: prefix <> suffix
814
+
808
815
@ doc false
809
816
# TODO: Remove by 2.0
810
817
# (hard-deprecated in elixir_dispatch)
0 commit comments