From 2afeb97b7c53ed146ec2cb996f61f1a7d56b372d Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 24 May 2021 18:44:13 -0400 Subject: Using FFI machinery when possible when doing text replacement. --- stdlib/source/lux/data/text.lux | 45 +++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) (limited to 'stdlib') diff --git a/stdlib/source/lux/data/text.lux b/stdlib/source/lux/data/text.lux index b344a2ad9..91d520c3c 100644 --- a/stdlib/source/lux/data/text.lux +++ b/stdlib/source/lux/data/text.lux @@ -170,14 +170,43 @@ (def: #export (replace_all pattern replacement template) (-> Text Text Text Text) - (loop [left "" - right template] - (case (..split_with pattern right) - (#.Some [pre post]) - (recur ($_ "lux text concat" left pre replacement) post) - - #.None - ("lux text concat" left right)))) + (for {@.old + (:coerce Text + ("jvm invokevirtual:java.lang.String:replace:java.lang.CharSequence,java.lang.CharSequence" + (:coerce (primitive "java.lang.String") template) + (:coerce (primitive "java.lang.CharSequence") pattern) + (:coerce (primitive "java.lang.CharSequence") replacement))) + @.jvm + (:coerce Text + ("jvm member invoke virtual" [] "java.lang.String" "replace" [] + (:coerce (primitive "java.lang.String") template) + ["Ljava/lang/CharSequence;" (:coerce (primitive "java.lang.CharSequence") pattern)] + ["Ljava/lang/CharSequence;" (:coerce (primitive "java.lang.CharSequence") replacement)])) + @.js + (:coerce Text + ("js object do" "replaceAll" template [pattern replacement])) + @.python + (:coerce Text + ("python object do" "replace" template pattern replacement)) + ## TODO @.lua + @.ruby + (:coerce Text + ("ruby object do" "gsub" template pattern replacement)) + @.php + (:coerce Text + ("php apply" (:assume ("php constant" "str_replace")) + pattern replacement template)) + ## TODO @.scheme + } + ## Inefficient default + (loop [left "" + right template] + (case (..split_with pattern right) + (#.Some [pre post]) + (recur ($_ "lux text concat" left pre replacement) post) + + #.None + ("lux text concat" left right))))) (structure: #export equivalence (Equivalence Text) -- cgit v1.2.3