diff --git a/src/String/Extra.elm b/src/String/Extra.elm index 6f5a9ec..bfabef6 100644 --- a/src/String/Extra.elm +++ b/src/String/Extra.elm @@ -741,12 +741,17 @@ consisting of the characters in the string that are to the right of the pattern. -} rightOfBack : String -> String -> String rightOfBack pattern string = - string - |> String.indexes pattern - |> List.reverse - |> List.head - |> Maybe.map ((+) (String.length pattern) >> (\a -> String.dropLeft a string)) - |> Maybe.withDefault "" + case String.indexes pattern string of + [] -> + "" + + firstIndex :: rest -> + case last rest of + Just lastIndex -> + String.slice (String.length pattern + lastIndex) (String.length string) string + + Nothing -> + String.slice (String.length pattern + firstIndex) (String.length string) string {-| Search a string from right to left for a pattern and return a substring @@ -757,12 +762,30 @@ consisting of the characters in the string that are to the left of the pattern. -} leftOfBack : String -> String -> String leftOfBack pattern string = - string - |> String.indexes pattern - |> List.reverse - |> List.head - |> Maybe.map (\a -> String.left a string) - |> Maybe.withDefault "" + case String.indexes pattern string of + [] -> + "" + + firstIndex :: rest -> + case last rest of + Just lastIndex -> + String.slice 0 lastIndex string + + Nothing -> + String.slice 0 firstIndex string + + +last : List a -> Maybe a +last items = + case items of + [] -> + Nothing + + [ x ] -> + Just x + + _ :: rest -> + last rest {-| Convert a string into a list of UTF-32 code points. diff --git a/tests/LeftOfBackTest.elm b/tests/LeftOfBackTest.elm new file mode 100644 index 0000000..94c30d9 --- /dev/null +++ b/tests/LeftOfBackTest.elm @@ -0,0 +1,13 @@ +module LeftOfBackTest exposing (leftOfBackTest) + +import Expect +import String.Extra exposing (leftOfBack) +import Test exposing (Test, test) + + +leftOfBackTest : Test +leftOfBackTest = + test "leftOfBack" <| + \() -> + leftOfBack "_" "This_is_a_test_string" + |> Expect.equal "This_is_a_test" diff --git a/tests/RightOfBackTest.elm b/tests/RightOfBackTest.elm new file mode 100644 index 0000000..40e0626 --- /dev/null +++ b/tests/RightOfBackTest.elm @@ -0,0 +1,13 @@ +module RightOfBackTest exposing (rightOfBackTest) + +import Expect +import String.Extra exposing (rightOfBack) +import Test exposing (Test, test) + + +rightOfBackTest : Test +rightOfBackTest = + test "rightOfBack" <| + \() -> + rightOfBack "_" "This_is_a_test_string" + |> Expect.equal "string"