packages feed

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

module Conversions.ToPurescript.Common where

import qualified SyntaxTrees.Haskell.Common    as H
import qualified SyntaxTrees.Purescript.Common as P

import           Data.Map (Map)
import qualified Data.Map as Map


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

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

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

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

varOpFn :: H.Var -> P.Var
varOpFn (H.Var x) = P.Var $ find varOpFnMap $ replaceNaming x

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


module' :: H.Module -> P.Module
module' (H.Module x) = P.Module $ replaceNaming <$> x

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


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



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

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

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

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

qClass :: H.QClass -> P.QClass
qClass (H.QClass x y) = P.QClass (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.empty

varOpMap :: Map String String
varOpMap = Map.fromList [(".", "<<<"), ("++", "<>"),
                         ("<&>", "<#>"),
                         (",", "/\\"), (",,", "Tuple3"),
                         (",,,", "Tuple4"), (",,,,", "Tuple5")]

ctorOpMap :: Map String String
ctorOpMap = Map.empty

varMap :: Map String String
varMap = Map.fromList [("fmap", "map")]

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

varOpFnMap :: Map String String
varOpFnMap = Map.fromList [("==", "eq"), ("/=", "notEq"),
                         ("<>", "append"), ("<$>", "map"),
                         ("<*>", "apply"), (">>=", "bind") ]