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

    import System.IO.Error (modifyIOError, ioeSetLocation, ioeGetLocation)
    import qualified Filesystem.Path.CurrentOS as FP

    #ifdef mingw32_HOST_OS
    import qualified System.Win32 as Win32
    #else
    import qualified System.Posix as Posix
    #endif

    createFileLink :: String -> String -> IO ()
    createFileLink target link =
      (`ioeAddLocation` "createFileLink") `modifyIOError` do
    #ifdef mingw32_HOST_OS
        Win32.createSymbolicLink False target link
    #else
        Posix.createSymbolicLink target link
    #endif

    getSymbolicLinkTarget :: String -> IO String
    getSymbolicLinkTarget path =
      (`ioeAddLocation` "getSymbolicLinkTarget") `modifyIOError` do
    #ifdef mingw32_HOST_OS
        Win32.readSymbolicLink path
    #else
        Posix.readSymbolicLink path
    #endif

    ioeAddLocation :: IOError -> String -> IOError
    ioeAddLocation e loc = do
      ioeSetLocation e newLoc
      where
        newLoc = loc ++ if Prelude.null oldLoc then "" else ":" ++ oldLoc
        oldLoc = ioeGetLocation e