{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
module Quaalude ( hex
, bool
, intersperse
, transpose
, sortBy
, void
, unless
, when
, join
, fold
, zipWithM_
, zipWithM
, filterM
, encode
, decode
, fromMaybe
, isNothing
, isPrefixOf
, isSuffixOf
, on
, both
, (***)
, (&&&)
, (<=<)
, ($>)
, first
, second
, getEnv
, exitWith
, showVersion
, traverse_
, nubSpecial
, (<>)
, ExitCode (ExitSuccess)
, MonadIO (..)
, makeExe
, shouldWrite
, silentCreateProcess
, Text
, pack
, unpack
, biaxe
, (.*)
, (.**)
, thread
, bisequence'
, Interpret
, Inject
, Generic
, Binary
, input
, auto
, detailed
, Rules
, Action
, command
, command_
, (%>)
, need
, want
, shake
, Rebuild (..)
, (~>)
, cmd
, cmd_
, ShakeOptions (..)
, shakeOptions
, copyFile'
, Change (..)
, Verbosity (..)
, removeFilesAfter
, Lint (..)
, takeBaseName
, takeFileName
, takeDirectory
, (-<.>)
, makeExecutable
, tlsManagerSettings
, newManager
, parseRequest
, httpLbs
, Response (..)
, Request (method, redirectCount)
, (</>)
, pathSeparator
, ByteString
, (<#>)
, (<+>)
, text
, punctuate
, dullred
, linebreak
, dullyellow
, hardline
, hang
, indent
, putDoc
, Pretty (pretty)
, module X
, Lens'
, over
, _Just
, view
, _1
, _2
, _4
, each
, (&)
, (%~)
#ifdef DEBUG
, traceShowId
, traceShow
#endif
) where
import Control.Arrow hiding ((<+>))
import Control.Composition
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.State.Lazy
import Data.Binary
import Data.Bool (bool)
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as BSL
import Data.Containers.ListUtils (nubOrd)
import Data.Foldable (fold, traverse_)
import Data.Functor (($>))
#if !MIN_VERSION_base(4,11,0)
import Data.Semigroup
#endif
import Data.List
import Data.Maybe (fromMaybe, isNothing)
import Data.Text.Lazy (Text, pack, unpack)
import Data.Version (showVersion)
#ifdef DEBUG
import Debug.Trace (traceShow, traceShowId)
#endif
import Development.Shake hiding (doesFileExist, getEnv)
import Development.Shake.FilePath
import Dhall hiding (Text, bool)
import Lens.Micro hiding (both)
import Lens.Micro.Extras
import Network.HTTP.Client
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Numeric (showHex)
import System.Directory as X
import System.Environment (getEnv)
import System.Exit (ExitCode (ExitSuccess), exitWith)
import System.Info (os)
#ifndef mingw32_HOST_OS
import System.Posix.Files
#endif
import System.Process as X
import System.Process.Ext
import Text.PrettyPrint.ANSI.Leijen hiding (bool, group, (<$>), (</>), (<>))
infixr 5 <#>
#ifdef mingw32_HOST_OS
makeExecutable :: FilePath -> IO ()
makeExecutable = pure mempty
#else
makeExecutable :: FilePath -> IO ()
makeExecutable = flip setFileMode ownerModes
#endif
nubSpecial :: (Ord a) => [[a]] -> [[a]]
nubSpecial = fmap pure . nubOrd . join
makeExe :: String
makeExe = case os of
"freebsd" -> "gmake"
"openbsd" -> "gmake"
"netbsd" -> "gmake"
"solaris" -> "gmake"
"dragonfly" -> "gmake"
_ -> "make"
hex :: Int -> String
hex = flip showHex mempty
(<#>) :: Doc -> Doc -> Doc
(<#>) a b = a <> line <> b
shouldWrite :: (MonadIO m, Binary a) => a -> FilePath -> m Bool
shouldWrite x fp = do
exists <- liftIO (doesFileExist fp)
contents <- if exists
then liftIO (BSL.readFile fp)
else pure mempty
pure $ BSL.length contents /= 0 && encode x /= contents