module System.Eval.Utils (
Import,
symbol,
escape,
getPaths,
mkUniqueWith,
cleanup,
module Data.Maybe,
module Control.Monad,
) where
import System.Plugins.Load ( Symbol )
import System.Plugins.Utils
import System.IO
import System.Directory
import Data.Char
import Data.Maybe
import Control.Monad
type Import = String
symbol :: Symbol
symbol :: Symbol
symbol = Symbol
"resource"
escape :: t Char -> Symbol
escape t Char
s = (Char -> Symbol) -> t Char -> Symbol
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Char
c -> Char -> ShowS
showLitChar Char
c ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Symbol
"") t Char
s
getPaths :: IO ([String],[String])
getPaths :: IO ([Symbol], [Symbol])
getPaths = do
let make_line :: [Symbol]
make_line = [Symbol
"-O0",Symbol
"-package",Symbol
"plugins"]
([Symbol], [Symbol]) -> IO ([Symbol], [Symbol])
forall (m :: * -> *) a. Monad m => a -> m a
return ([Symbol]
make_line,[])
mkUniqueWith :: (String -> String -> [Import] -> String)
-> String
-> [Import] -> IO FilePath
mkUniqueWith :: (Symbol -> Symbol -> [Symbol] -> Symbol)
-> Symbol -> [Symbol] -> IO Symbol
mkUniqueWith Symbol -> Symbol -> [Symbol] -> Symbol
wrapper Symbol
src [Symbol]
mods = do
(Symbol
tmpf,Handle
hdl) <- IO (Symbol, Handle)
hMkUnique
let nm :: Symbol
nm = ShowS
mkModid (ShowS
basename Symbol
tmpf)
src' :: Symbol
src' = Symbol -> Symbol -> [Symbol] -> Symbol
wrapper Symbol
src Symbol
nm [Symbol]
mods
Handle -> Symbol -> IO ()
hPutStr Handle
hdl Symbol
src' IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Handle -> IO ()
hFlush Handle
hdl IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Handle -> IO ()
hClose Handle
hdl IO () -> IO Symbol -> IO Symbol
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Symbol -> IO Symbol
forall (m :: * -> *) a. Monad m => a -> m a
return Symbol
tmpf
cleanup :: String -> String -> IO ()
cleanup :: Symbol -> Symbol -> IO ()
cleanup Symbol
a Symbol
b = (Symbol -> IO ()) -> [Symbol] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Symbol -> IO ()
removeFile [Symbol
a, Symbol
b, Symbol -> ShowS
replaceSuffix Symbol
b Symbol
".hi"]