@@ -6,7 +6,7 @@
66#if __GLASGOW_HASKELL__ >= 708
77{-# LANGUAGE TypeFamilies #-}
88#endif
9−{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
9+{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI, UnliftedFFITypes #-}
1010-- |
1111-- Module : Data.Text
1212-- Copyright : (c) 2009, 2010, 2011, 2012 Bryan O'Sullivan,
@@ -247,13 +247,15 @@ import Text.Printf (PrintfArg, formatArg, formatString)
247247#endif
248248
249249-- GHCJS ------------------------------------------------------------
250−import Data.JSString (JSString)
250+import Data.JSString.Internal.Type (JSString (..))
251251import qualified Data.JSString as JSS
252252import qualified Data.JSString.Internal.Fusion as SJS
253253import qualified Data.JSString.Internal.Fusion.Common as SJS
254254import Data.Coerce
255−import GHC.Exts (Addr#)
255+import GHC.Base (build)
256256import qualified GHC.CString as GHC
257+import GHC.Exts (Addr#, ByteArray#)
258+import GHCJS.Prim (JSVal (..))
257259
258260unpack :: Text -> String
259261unpack = coerce JSS.unpack
@@ -270,6 +272,10 @@ singleton = coerce JSS.singleton
270272 unstream (S.singleton (safe a)) = singleton a
271273 #-}
272274
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+
273279-- | /O(n)/ Convert a literal string into a JSString. Subject to fusion.
274280unpackCString# :: Addr# -> Text
275281unpackCString# addr# = Text $ SJS.unstream (SJS.streamCString# addr#)