Skip to content

Commit

Permalink
Recreate stdlib dir only when juvix version changes
Browse files Browse the repository at this point in the history
  • Loading branch information
paulcadman committed Oct 18, 2022
1 parent 026c0c9 commit 67ca7df
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 8 deletions.
4 changes: 2 additions & 2 deletions src/Juvix/Compiler/Pipeline/Setup.hs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
module Juvix.Compiler.Pipeline.Setup where

import Juvix.Compiler.Pipeline.EntryPoint
import Juvix.Prelude
import Juvix.Extra.Paths
import Juvix.Extra.Stdlib
import Juvix.Prelude

entrySetup ::
Members '[Embed IO, Reader EntryPoint, Files] r =>
Expand All @@ -21,7 +21,7 @@ setupStdlib = do
stdlibRootPath <- case e ^. entryPointStdlibPath of
Nothing -> do
let d = (e ^. entryPointRoot) </> juvixStdlibDir
updateStdlib d
runReader d updateStdlib
return d
Just p -> return p
registerStdlib stdlibRootPath
37 changes: 33 additions & 4 deletions src/Juvix/Extra/Stdlib.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,48 @@ module Juvix.Extra.Stdlib where

import Data.ByteString qualified as BS
import Juvix.Extra.Paths
import Juvix.Extra.Version
import Juvix.Prelude

type RootPath = FilePath

stdlibFiles :: [(FilePath, ByteString)]
stdlibFiles = filter isJuvixFile $(stdlibDir)
where
isJuvixFile :: (FilePath, ByteString) -> Bool
isJuvixFile (fp, _) = takeExtension fp == ".juvix"

writeStdlib :: forall r. Member (Embed IO) r => FilePath -> Sem r ()
writeStdlib rootDir = forM_ (first (rootDir </>) <$> stdlibFiles) (uncurry writeJuvixFile)
writeStdlib :: forall r. Members '[Reader RootPath, Embed IO] r => Sem r ()
writeStdlib = do
rootDir <- ask
forM_ (first (rootDir </>) <$> stdlibFiles) (uncurry writeJuvixFile)
where
writeJuvixFile :: FilePath -> ByteString -> Sem r ()
writeJuvixFile p bs = embed (createDirectoryIfMissing True (takeDirectory p) >> BS.writeFile p bs)

updateStdlib :: forall r. Member (Embed IO) r => FilePath -> Sem r ()
updateStdlib rootDir = unlessM (embed (doesDirectoryExist rootDir)) (writeStdlib rootDir)
stdlibVersionFile :: Member (Reader RootPath) r => Sem r FilePath
stdlibVersionFile = (</> ".version") <$> ask

writeVersion :: forall r. Members '[Reader RootPath, Embed IO] r => Sem r ()
writeVersion = (embed . flip writeFile versionTag) =<< stdlibVersionFile

readVersion :: Members '[Reader RootPath, Embed IO] r => Sem r (Maybe Text)
readVersion = do
vf <- stdlibVersionFile
embed (whenMaybeM (doesFileExist vf) (readFile vf))

updateStdlib :: forall r. Members '[Reader RootPath, Embed IO] r => Sem r ()
updateStdlib =
whenM shouldUpdate $ do
whenM
(embed . doesDirectoryExist =<< ask)
(embed . removeDirectoryRecursive =<< ask)
writeStdlib
writeVersion
where
shouldUpdate :: Sem r Bool
shouldUpdate =
orM
[ not <$> (embed . doesDirectoryExist =<< ask),
(Just versionTag /=) <$> readVersion
]
4 changes: 2 additions & 2 deletions src/Juvix/Prelude/Base.hs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ import GHC.Real
import GHC.Stack.Types
import Language.Haskell.TH.Syntax (Lift)
import Lens.Micro.Platform hiding (both)
import Path (parseAbsDir, toFilePath)
import Path.IO (listDirRecur)
import Polysemy
import Polysemy.Embed
import Polysemy.Error hiding (fromEither)
Expand Down Expand Up @@ -163,8 +165,6 @@ import System.IO hiding
)
import Text.Show (Show)
import Text.Show qualified as Show
import Path.IO (listDirRecur)
import Path (parseAbsDir, toFilePath)

--------------------------------------------------------------------------------

Expand Down

0 comments on commit 67ca7df

Please sign in to comment.