Sha256: 06f600c8b96ce0b4b4e73feadb8686f2641348320ad89aa5708929bc00b9a0b4

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

{-# LANGUAGE PatternGuards #-}

module Language.Ruby.Hubris.ZCode (zenc,zdec,Zname(..)) where

import Data.Char
import Data.Ix
import qualified Data.Map as M
import Numeric

zemap :: M.Map Char String
zemap = M.fromList $
    [ ('(', "ZL")
    , (')', "ZR")
    , ('[', "ZM")
    , (']', "ZN")
    , (':', "ZC")
    , ('Z', "ZZ")

    , ('z', "zz")
    , ('&', "za")
    , ('|', "zb")
    , ('^', "zc")
    , ('$', "zd")
    , ('=', "ze")
    , ('>', "zg")
    , ('#', "zh")
    , ('.', "zi")
    , ('<', "zl")
    , ('-', "zm")
    , ('!', "zn")
    , ('+', "zp")
    , ('\'', "zq")
    , ('\\', "zr")
    , ('/', "zs")
    , ('*', "zt")
    , ('_', "zu")
    , ('%', "zv")
    ]

zdmap :: M.Map String Char
zdmap = M.fromList . map (\(a, b) -> (b, a)) . M.toList $ zemap

newtype Zname = Zname String
zenc :: String -> Zname
zenc s = Zname $ concatMap (\c -> M.findWithDefault (z c) c zemap) s
    where
    z c
        | any (($ c) . inRange) [('a', 'y'), ('A', 'Z'), ('0', '9')] =
            [c]
        | otherwise =
            let
                s = showHex (ord c) "U"
                p = if inRange ('0', '9') (head s) then id else ('0' :)
            in
            'z' : p s

zdec :: String -> String
zdec "" = ""
zdec [c] = [c]
zdec (c : cs@(c' : cs'))
    | c `elem` "zZ"
    , Just x <- M.lookup [c, c'] zdmap
    = x : zdec cs'
    | c == 'z'
    , (h@(_ : _), 'U' : t) <- span isHexDigit cs
    , [(n, "")] <- readHex h
    = chr n : zdec t
    | otherwise = c : zdec cs

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
hubris-0.0.6 Haskell/Language/Ruby/Hubris/ZCode.hs
hubris-0.0.5 Haskell/Language/Ruby/Hubris/ZCode.hs
hubris-0.0.4 Haskell/Language/Ruby/Hubris/ZCode.hs