packages feed

nixpkgs-update-0.3.0: src/File.hs

{-# 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)