{-# LANGUAGE BlockArguments #-}
module HLint.Plugin.Settings
(
argsSettings
) where
import Control.Concurrent.MVar (MVar)
import Data.Map (Map)
import Language.Haskell.HLint (Classify, Hint, ParseFlags)
import qualified Control.Concurrent.MVar as MVar
import qualified Data.Map as Map
import qualified Language.Haskell.HLint as HLint
import qualified System.IO.Unsafe as Unsafe
cache :: MVar (Map [String] (ParseFlags, [Classify], Hint))
cache :: MVar (Map [String] (ParseFlags, [Classify], Hint))
cache = IO (MVar (Map [String] (ParseFlags, [Classify], Hint)))
-> MVar (Map [String] (ParseFlags, [Classify], Hint))
forall a. IO a -> a
Unsafe.unsafePerformIO (Map [String] (ParseFlags, [Classify], Hint)
-> IO (MVar (Map [String] (ParseFlags, [Classify], Hint)))
forall a. a -> IO (MVar a)
MVar.newMVar Map [String] (ParseFlags, [Classify], Hint)
forall k a. Map k a
Map.empty)
{-# NOINLINE cache #-}
semaphore :: MVar ()
semaphore :: MVar ()
semaphore = IO (MVar ()) -> MVar ()
forall a. IO a -> a
Unsafe.unsafePerformIO (() -> IO (MVar ())
forall a. a -> IO (MVar a)
MVar.newMVar ())
{-# NOINLINE semaphore #-}
argsSettings
:: [String]
-> IO (ParseFlags, [Classify], Hint)
argsSettings :: [String] -> IO (ParseFlags, [Classify], Hint)
argsSettings [String]
key =
MVar (Map [String] (ParseFlags, [Classify], Hint))
-> (Map [String] (ParseFlags, [Classify], Hint)
-> IO
(Map [String] (ParseFlags, [Classify], Hint),
(ParseFlags, [Classify], Hint)))
-> IO (ParseFlags, [Classify], Hint)
forall a b. MVar a -> (a -> IO (a, b)) -> IO b
MVar.modifyMVar MVar (Map [String] (ParseFlags, [Classify], Hint))
cache \Map [String] (ParseFlags, [Classify], Hint)
m -> do
case [String]
-> Map [String] (ParseFlags, [Classify], Hint)
-> Maybe (ParseFlags, [Classify], Hint)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup [String]
key Map [String] (ParseFlags, [Classify], Hint)
m of
Maybe (ParseFlags, [Classify], Hint)
Nothing -> do
(ParseFlags, [Classify], Hint)
value <- IO (ParseFlags, [Classify], Hint)
-> IO (ParseFlags, [Classify], Hint)
forall a. IO a -> IO a
Unsafe.unsafeInterleaveIO do
MVar ()
-> (() -> IO (ParseFlags, [Classify], Hint))
-> IO (ParseFlags, [Classify], Hint)
forall a b. MVar a -> (a -> IO b) -> IO b
MVar.withMVar MVar ()
semaphore \()
_ -> [String] -> IO (ParseFlags, [Classify], Hint)
HLint.argsSettings [String]
key
(Map [String] (ParseFlags, [Classify], Hint),
(ParseFlags, [Classify], Hint))
-> IO
(Map [String] (ParseFlags, [Classify], Hint),
(ParseFlags, [Classify], Hint))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([String]
-> (ParseFlags, [Classify], Hint)
-> Map [String] (ParseFlags, [Classify], Hint)
-> Map [String] (ParseFlags, [Classify], Hint)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert [String]
key (ParseFlags, [Classify], Hint)
value Map [String] (ParseFlags, [Classify], Hint)
m, (ParseFlags, [Classify], Hint)
value)
Just (ParseFlags, [Classify], Hint)
value ->
(Map [String] (ParseFlags, [Classify], Hint),
(ParseFlags, [Classify], Hint))
-> IO
(Map [String] (ParseFlags, [Classify], Hint),
(ParseFlags, [Classify], Hint))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Map [String] (ParseFlags, [Classify], Hint)
m, (ParseFlags, [Classify], Hint)
value)