packages feed

hydra-jvm-0.17.0: src/main/haskell/Hydra/Jvm/Serde.hs

-- Note: this is an automatically generated file. Do not edit.
-- | Common JVM serialization helpers: Java/Scala string and character escaping

module Hydra.Jvm.Serde where
import qualified Hydra.Overlay.Haskell.Lib.Lists as Lists
import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic
import qualified Hydra.Overlay.Haskell.Lib.Strings as Strings
import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)

-- | Escape a single character for use in a Java/Scala string or character literal
escapeJavaChar :: Int -> String
escapeJavaChar c =
    Logic.ifElse (c == 34) "\\\""
    (Logic.ifElse (c == 92) "\\\\"
    (Logic.ifElse (c == 10) "\\n"
    (Logic.ifElse (c == 13) "\\r"
    (Logic.ifElse (c == 9)  "\\t"
    (Logic.ifElse (c == 8)  "\\b"
    (Logic.ifElse (c == 12) "\\f"
    (Logic.ifElse (c >= 32 && c < 127) (Strings.fromList [c])
    (javaUnicodeEscape c))))))))

-- | Escape a string for use in a Java/Scala string literal
escapeJavaString :: String -> String
escapeJavaString s = Strings.cat (Lists.map escapeJavaChar (Strings.toList s))

-- | Convert an integer in [0,15] to the ASCII code of the corresponding hex digit
hexDigit :: Int -> Int
hexDigit n = Logic.ifElse (n < 10) (n + 48) (n - 10 + 65)

-- | Produce a \\uXXXX Unicode escape for the given code point
javaUnicodeEscape :: Int -> String
javaUnicodeEscape n =
    Logic.ifElse (n > 65535)
      (let n' = n - 65536
           hi = 55296 + (n' `div` 1024)
           lo = 56320 + (n' `mod` 1024)
       in "\\u" ++ padHex4 hi ++ "\\u" ++ padHex4 lo)
      ("\\u" ++ padHex4 n)

-- | Pad an integer to 4 hex digits
padHex4 :: Int -> String
padHex4 n =
    let d3 = n `div` 4096
        r3 = n `mod` 4096
        d2 = r3 `div` 256
        r2 = r3 `mod` 256
        d1 = r2 `div` 16
        d0 = r2 `mod` 16
    in Strings.fromList [hexDigit d3, hexDigit d2, hexDigit d1, hexDigit d0]