    {-# OPTIONS -Wall #-}
    module Shelly.Directory where

    import System.IO.Error (modifyIOError, ioeSetLocation, ioeGetLocation)

    import qualified System.PosixCompat as Posix

    createFileLink :: String -> String -> IO ()
    createFileLink :: String -> String -> IO ()
    createFileLink String
    target String
    link =
      (IOError -> String -> IOError
    `ioeAddLocation` String
    "createFileLink") (IOError -> IOError) -> IO () -> IO ()
    forall a. (IOError -> IOError) -> IO a -> IO a
    `modifyIOError` do
        String -> String -> IO ()
    Posix.createSymbolicLink String
    target String
    link

    getSymbolicLinkTarget :: String -> IO String
    getSymbolicLinkTarget :: String -> IO String
    getSymbolicLinkTarget String
    path =
      (IOError -> String -> IOError
    `ioeAddLocation` String
    "getSymbolicLinkTarget") (IOError -> IOError) -> IO String -> IO String
    forall a. (IOError -> IOError) -> IO a -> IO a
    `modifyIOError` do
        String -> IO String
    Posix.readSymbolicLink String
    path

    ioeAddLocation :: IOError -> String -> IOError
    ioeAddLocation :: IOError -> String -> IOError
    ioeAddLocation IOError
    e String
    loc = do
      IOError -> String -> IOError
    ioeSetLocation IOError
    e String
    newLoc
      where
        newLoc :: String
    newLoc = String
    loc String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ if String -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    Prelude.null String
    oldLoc then String
    "" else String
    ":" String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    oldLoc
        oldLoc :: String
    oldLoc = IOError -> String
    ioeGetLocation IOError
    e