packages feed

polyglot-0.1.1.0: src/Conversions/ToScala/Common.hs

module Conversions.ToScala.Common where

import qualified SyntaxTrees.Haskell.Common as H
import qualified SyntaxTrees.Scala.Common   as S

import           Data.Map    (Map)
import qualified Data.Map    as Map
import           Text.Casing (quietSnake)



var :: H.Var -> S.Var
var (H.Var x) = S.Var $ replaceNaming x

ctor :: H.Ctor -> S.Ctor
ctor (H.Ctor x) = S.Ctor $ replaceNaming x

varOp :: H.VarOp -> S.VarOp
varOp (H.VarOp x) = S.VarOp $ replaceNaming x

ctorOp :: H.CtorOp -> S.CtorOp
ctorOp (H.CtorOp x) = S.CtorOp $ replaceNaming x

class' :: H.Class -> S.TypeClass
class' (H.Class x) = S.TypeClass x


module' :: H.Module -> S.Package
module' (H.Module x) = S.Package $ (replaceNaming . quietSnake) <$> x

qualifier' :: H.Module -> S.Package
qualifier' (H.Module x) = S.Package $ replaceNaming <$> x


literal :: H.Literal -> S.Literal
literal H.UnitLit       = S.UnitLit
literal (H.BoolLit x)   = S.BoolLit x
literal (H.IntLit x)    = S.IntLit x
literal (H.FloatLit x)  = S.FloatLit x
literal (H.CharLit x)   = S.CharLit x
literal (H.StringLit x) = S.StringLit x



qVar :: H.QVar -> S.QVar
qVar (H.QVar x y) = S.QVar (qualifier' <$> x) (var y)

qVarOp :: H.QVarOp -> S.QVarOp
qVarOp (H.QVarOp x y) = S.QVarOp (qualifier' <$> x) (varOp y)

qCtor :: H.QCtor -> S.QCtor
qCtor (H.QCtor x y) = S.QCtor (qualifier' <$> x) (ctor y)

qCtorOp :: H.QCtorOp -> S.QCtorOp
qCtorOp (H.QCtorOp x y) = S.QCtorOp (qualifier' <$> x) (ctorOp y)

qClass :: H.QClass -> S.QTypeClass
qClass (H.QClass x y) = S.QTypeClass (qualifier' <$> x) (class' y)


replaceNaming :: String -> String
replaceNaming x = find charMap <$> find globalMap x

find :: Ord k => Map k k -> k -> k
find x y = Map.findWithDefault y y x

globalMap :: Map String String
globalMap = varOpMap <> ctorOpMap <> varMap <> ctorMap


charMap :: Map Char Char
charMap = Map.fromList [('\'', '$'), ('$', '&'), ('.', '|')]

varOpMap :: Map String String
varOpMap = Map.fromList [("$", "|<|"), (".", "^"),
                         ("++", "<+>"), ("<>", "<+>"),
                         (",", "Tuple2"), (",,", "Tuple3"),
                         (",,,", "Tuple4"), (",,,,", "Tuple5")]

ctorOpMap :: Map String String
ctorOpMap = Map.fromList [(":", "::"), ("::", ":")]

varMap :: Map String String
varMap = Map.fromList [("type", "typex"), ("var", "varx"),
                       ("def", "defx"), ("match", "matchx")]

ctorMap :: Map String String
ctorMap = Map.fromList [("Just", "Some"), ("Nothing", "None"),
                       ("True", "true"), ("False", "false")]

autoIds :: [String]
autoIds = pure <$> ['x', 'y', 'z', 't', 'u', 'v', 'w', 'p', 'q', 'r', 's']