on master help sign in
Inline JSStrings without converting them via lists
6cc95ebRyan Trinkle
Data/Text.hs+9−3
@@ -6,7 +6,7 @@
6#if __GLASGOW_HASKELL__ >= 708
6#if __GLASGOW_HASKELL__ >= 708
7{-# LANGUAGE TypeFamilies #-}
7{-# LANGUAGE TypeFamilies #-}
8#endif
8#endif
9−{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
9+{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI, UnliftedFFITypes #-}
10-- |
10-- |
11-- Module : Data.Text
11-- Module : Data.Text
12-- Copyright : (c) 2009, 2010, 2011, 2012 Bryan O'Sullivan,
12-- Copyright : (c) 2009, 2010, 2011, 2012 Bryan O'Sullivan,
@@ -247,13 +247,15 @@ import Text.Printf (PrintfArg, formatArg, formatString)
247#endif
247#endif
248
248
249-- GHCJS ------------------------------------------------------------
249-- GHCJS ------------------------------------------------------------
250−import Data.JSString (JSString)
250+import Data.JSString.Internal.Type (JSString (..))
251import qualified Data.JSString as JSS
251import qualified Data.JSString as JSS
252import qualified Data.JSString.Internal.Fusion as SJS
252import qualified Data.JSString.Internal.Fusion as SJS
253import qualified Data.JSString.Internal.Fusion.Common as SJS
253import qualified Data.JSString.Internal.Fusion.Common as SJS
254import Data.Coerce
254import Data.Coerce
255−import GHC.Exts (Addr#)
255+import GHC.Base (build)
256import qualified GHC.CString as GHC
256import qualified GHC.CString as GHC
257+import GHC.Exts (Addr#, ByteArray#)
258+import GHCJS.Prim (JSVal (..))
257
259
258unpack :: Text -> String
260unpack :: Text -> String
259unpack = coerce JSS.unpack
261unpack = coerce JSS.unpack
@@ -270,6 +272,10 @@ singleton = coerce JSS.singleton
270 unstream (S.singleton (safe a)) = singleton a
272 unstream (S.singleton (safe a)) = singleton a
271 #-}
273 #-}
272
274
275+foreign import javascript unsafe "$r = $1;" addrToByteArray :: Addr# -> ByteArray#
276+
277+{-# RULES "inlineJSString" forall s. pack (GHC.Base.build (GHC.unpackFoldrCString# s)) = Text (JSString (JSVal (addrToByteArray s))) #-}
278+
273-- | /O(n)/ Convert a literal string into a JSString. Subject to fusion.
279-- | /O(n)/ Convert a literal string into a JSString. Subject to fusion.
274unpackCString# :: Addr# -> Text
280unpackCString# :: Addr# -> Text
275unpackCString# addr# = Text $ SJS.unstream (SJS.streamCString# addr#)
281unpackCString# addr# = Text $ SJS.unstream (SJS.streamCString# addr#)