-- | Various functions generated as builtins module Haste.Builtins (toBuiltin) where import GhcPlugins as P import Data.JSTarget as J import Control.Applicative -- TODO: proxy# (and probably void#, realWorld# and coercionToken# as well) -- should really just go away in the final code. toBuiltin :: P.Var -> Maybe J.Var toBuiltin v = case (modname, varname) of (Just "GHC.Prim", "coercionToken#") -> Just $ foreignVar "_" (Just "GHC.Prim", "realWorld#") -> Just $ foreignVar "_" (Just "GHC.Prim", "void#") -> Just $ foreignVar "_" (Just "GHC.Prim", "proxy#") -> Just $ foreignVar "_" (Just "GHC.Err", "error") -> Just $ foreignVar "err" -- Everything to do with unpacking had better be built in for compactness, -- efficiency and space reasons. (Just "GHC.CString", "unpackCString#") -> Just $ foreignVar "unCStr" (Just "GHC.CString", "unpackCStringUtf8#") -> Just $ foreignVar "unCStr" (Just "GHC.CString", "unpackAppendCString#") -> Just $ foreignVar "unAppCStr" (Just "GHC.CString", "unpackFoldrCString#") -> Just $ foreignVar "unFoldrCStr" -- Primitive needs of the Haste standard library (Just "Haste.Prim", "jsRound") -> Just $ foreignVar "Math.round" (Just "Haste.Prim", "jsCeiling") -> Just $ foreignVar "Math.ceil" (Just "Haste.Prim", "jsFloor") -> Just $ foreignVar "Math.floor" _ | otherwise -> Nothing where modname = moduleNameString . moduleName <$> nameModule_maybe (varName v) varname = occNameString $ nameOccName $ varName v