{-# LANGUAGE BlockArguments #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} module File where import qualified Data.Text as T import Data.Text.IO as T import OurPrelude import Polysemy.Input import Polysemy.Output data File m a where Read :: FilePath -> File m Text Write :: FilePath -> Text -> File m () makeSem ''File runIO :: Member (Embed IO) r => Sem (File ': r) a -> Sem r a runIO = interpret $ \case Read file -> embed $ T.readFile file Write file contents -> embed $ T.writeFile file contents runPure :: [Text] -> Sem (File ': r) a -> Sem r ([Text], a) runPure contentList = runOutputMonoid pure . runInputList contentList . reinterpret2 \case Read _file -> maybe "" id <$> input Write _file contents -> output contents replace :: Member File r => Text -> Text -> FilePath -> Sem r Bool replace find replacement file = do contents <- File.read file let newContents = T.replace find replacement contents when (contents /= newContents) $ do File.write file newContents return $ contents /= newContents replaceIO :: MonadIO m => Text -> Text -> FilePath -> m Bool replaceIO find replacement file = liftIO $ runFinal $ embedToFinal $ runIO $ (replace find replacement file)