{-# OPTIONS_GHC -fno-warn-orphans #-}

module Ribosome.Control.Monad.Ribo where

import Control.Exception.Lifted (onException)
import Control.Lens (Lens')
import qualified Control.Lens as Lens (mapMOf, over, view)
import Control.Monad.Base (MonadBase(..))
import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
import Control.Monad.Error.Class (MonadError(..))
import qualified Control.Monad.Reader as ReaderT
import Control.Monad.Trans.Free (FreeT)
import Control.Monad.Trans.Resource (MonadResource(..), runResourceT)
import qualified Control.Monad.Trans.State.Strict as StateT (gets, modify)
import Data.DeepLenses (DeepLenses(deepLens))
import Data.DeepPrisms (DeepPrisms)
import Neovim.Context.Internal (Neovim(..))

import Ribosome.Control.Ribosome (Ribosome, RibosomeInternal, RibosomeState)
import qualified Ribosome.Control.Ribosome as Ribosome (_errors, errors, name, state)
import qualified Ribosome.Control.Ribosome as RibosomeState (internal, public)
import Ribosome.Control.StrictRibosome (StrictRibosome)
import qualified Ribosome.Control.StrictRibosome as StrictRibosome (name, state)
import Ribosome.Data.Errors (Errors)
import Ribosome.Nvim.Api.RpcCall (Rpc, RpcError)
import qualified Ribosome.Nvim.Api.RpcCall as Rpc (Rpc(..))
import Ribosome.Orphans ()
import Ribosome.Plugin.RpcHandler (RpcHandler(..))

type RNeovim s = Neovim (Ribosome s)

instance MonadBase IO (Neovim e) where
  liftBase :: IO α -> Neovim e α
liftBase = IO α -> Neovim e α
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO

instance MonadBaseControl IO (Neovim e) where
  type StM (Neovim e) a = a
  liftBaseWith :: (RunInBase (Neovim e) IO -> IO a) -> Neovim e a
liftBaseWith RunInBase (Neovim e) IO -> IO a
f =
    ResourceT (ReaderT (Config e) IO) a -> Neovim e a
forall env a. ResourceT (ReaderT (Config env) IO) a -> Neovim env a
Neovim (ReaderT (Config e) IO a -> ResourceT (ReaderT (Config e) IO) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ReaderT (Config e) IO a -> ResourceT (ReaderT (Config e) IO) a)
-> ReaderT (Config e) IO a -> ResourceT (ReaderT (Config e) IO) a
forall a b. (a -> b) -> a -> b
$ (Config e -> IO a) -> ReaderT (Config e) IO a
forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT ((Config e -> IO a) -> ReaderT (Config e) IO a)
-> (Config e -> IO a) -> ReaderT (Config e) IO a
forall a b. (a -> b) -> a -> b
$ \Config e
r -> RunInBase (Neovim e) IO -> IO a
f (Config e -> Neovim e a -> IO a
forall env a. Config env -> Neovim env a -> IO a
peel Config e
r))
    where
      peel :: Config env -> Neovim env a -> IO a
peel Config env
r Neovim env a
ma =
        ReaderT (Config env) IO a -> Config env -> IO a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (ResourceT (ReaderT (Config env) IO) a -> ReaderT (Config env) IO a
forall (m :: * -> *) a. MonadUnliftIO m => ResourceT m a -> m a
runResourceT (Neovim env a -> ResourceT (ReaderT (Config env) IO) a
forall env a. Neovim env a -> ResourceT (ReaderT (Config env) IO) a
unNeovim Neovim env a
ma)) Config env
r
  restoreM :: StM (Neovim e) a -> Neovim e a
restoreM = StM (Neovim e) a -> Neovim e a
forall (m :: * -> *) a. Monad m => a -> m a
return

newtype Ribo s e a =
  Ribo { Ribo s e a -> ExceptT e (RNeovim s) a
unRibo :: ExceptT e (RNeovim s) a }
  deriving newtype (a -> Ribo s e b -> Ribo s e a
(a -> b) -> Ribo s e a -> Ribo s e b
(forall a b. (a -> b) -> Ribo s e a -> Ribo s e b)
-> (forall a b. a -> Ribo s e b -> Ribo s e a)
-> Functor (Ribo s e)
forall a b. a -> Ribo s e b -> Ribo s e a
forall a b. (a -> b) -> Ribo s e a -> Ribo s e b
forall s e a b. a -> Ribo s e b -> Ribo s e a
forall s e a b. (a -> b) -> Ribo s e a -> Ribo s e b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Ribo s e b -> Ribo s e a
$c<$ :: forall s e a b. a -> Ribo s e b -> Ribo s e a
fmap :: (a -> b) -> Ribo s e a -> Ribo s e b
$cfmap :: forall s e a b. (a -> b) -> Ribo s e a -> Ribo s e b
Functor, Functor (Ribo s e)
a -> Ribo s e a
Functor (Ribo s e)
-> (forall a. a -> Ribo s e a)
-> (forall a b. Ribo s e (a -> b) -> Ribo s e a -> Ribo s e b)
-> (forall a b c.
    (a -> b -> c) -> Ribo s e a -> Ribo s e b -> Ribo s e c)
-> (forall a b. Ribo s e a -> Ribo s e b -> Ribo s e b)
-> (forall a b. Ribo s e a -> Ribo s e b -> Ribo s e a)
-> Applicative (Ribo s e)
Ribo s e a -> Ribo s e b -> Ribo s e b
Ribo s e a -> Ribo s e b -> Ribo s e a
Ribo s e (a -> b) -> Ribo s e a -> Ribo s e b
(a -> b -> c) -> Ribo s e a -> Ribo s e b -> Ribo s e c
forall a. a -> Ribo s e a
forall s e. Functor (Ribo s e)
forall a b. Ribo s e a -> Ribo s e b -> Ribo s e a
forall a b. Ribo s e a -> Ribo s e b -> Ribo s e b
forall a b. Ribo s e (a -> b) -> Ribo s e a -> Ribo s e b
forall s e a. a -> Ribo s e a
forall a b c.
(a -> b -> c) -> Ribo s e a -> Ribo s e b -> Ribo s e c
forall s e a b. Ribo s e a -> Ribo s e b -> Ribo s e a
forall s e a b. Ribo s e a -> Ribo s e b -> Ribo s e b
forall s e a b. Ribo s e (a -> b) -> Ribo s e a -> Ribo s e b
forall s e a b c.
(a -> b -> c) -> Ribo s e a -> Ribo s e b -> Ribo s e c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Ribo s e a -> Ribo s e b -> Ribo s e a
$c<* :: forall s e a b. Ribo s e a -> Ribo s e b -> Ribo s e a
*> :: Ribo s e a -> Ribo s e b -> Ribo s e b
$c*> :: forall s e a b. Ribo s e a -> Ribo s e b -> Ribo s e b
liftA2 :: (a -> b -> c) -> Ribo s e a -> Ribo s e b -> Ribo s e c
$cliftA2 :: forall s e a b c.
(a -> b -> c) -> Ribo s e a -> Ribo s e b -> Ribo s e c
<*> :: Ribo s e (a -> b) -> Ribo s e a -> Ribo s e b
$c<*> :: forall s e a b. Ribo s e (a -> b) -> Ribo s e a -> Ribo s e b
pure :: a -> Ribo s e a
$cpure :: forall s e a. a -> Ribo s e a
$cp1Applicative :: forall s e. Functor (Ribo s e)
Applicative, Applicative (Ribo s e)
a -> Ribo s e a
Applicative (Ribo s e)
-> (forall a b. Ribo s e a -> (a -> Ribo s e b) -> Ribo s e b)
-> (forall a b. Ribo s e a -> Ribo s e b -> Ribo s e b)
-> (forall a. a -> Ribo s e a)
-> Monad (Ribo s e)
Ribo s e a -> (a -> Ribo s e b) -> Ribo s e b
Ribo s e a -> Ribo s e b -> Ribo s e b
forall a. a -> Ribo s e a
forall s e. Applicative (Ribo s e)
forall a b. Ribo s e a -> Ribo s e b -> Ribo s e b
forall a b. Ribo s e a -> (a -> Ribo s e b) -> Ribo s e b
forall s e a. a -> Ribo s e a
forall s e a b. Ribo s e a -> Ribo s e b -> Ribo s e b
forall s e a b. Ribo s e a -> (a -> Ribo s e b) -> Ribo s e b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Ribo s e a
$creturn :: forall s e a. a -> Ribo s e a
>> :: Ribo s e a -> Ribo s e b -> Ribo s e b
$c>> :: forall s e a b. Ribo s e a -> Ribo s e b -> Ribo s e b
>>= :: Ribo s e a -> (a -> Ribo s e b) -> Ribo s e b
$c>>= :: forall s e a b. Ribo s e a -> (a -> Ribo s e b) -> Ribo s e b
$cp1Monad :: forall s e. Applicative (Ribo s e)
Monad, Monad (Ribo s e)
Monad (Ribo s e)
-> (forall a. IO a -> Ribo s e a) -> MonadIO (Ribo s e)
IO a -> Ribo s e a
forall a. IO a -> Ribo s e a
forall s e. Monad (Ribo s e)
forall s e a. IO a -> Ribo s e a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> Ribo s e a
$cliftIO :: forall s e a. IO a -> Ribo s e a
$cp1MonadIO :: forall s e. Monad (Ribo s e)
MonadIO, Monad (Ribo s e)
e -> Ribo s e a
Monad (Ribo s e)
-> (forall e a. Exception e => e -> Ribo s e a)
-> MonadThrow (Ribo s e)
forall s e. Monad (Ribo s e)
forall e a. Exception e => e -> Ribo s e a
forall s e e a. Exception e => e -> Ribo s e a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> Ribo s e a
$cthrowM :: forall s e e a. Exception e => e -> Ribo s e a
$cp1MonadThrow :: forall s e. Monad (Ribo s e)
MonadThrow, MonadThrow (Ribo s e)
MonadThrow (Ribo s e)
-> (forall e a.
    Exception e =>
    Ribo s e a -> (e -> Ribo s e a) -> Ribo s e a)
-> MonadCatch (Ribo s e)
Ribo s e a -> (e -> Ribo s e a) -> Ribo s e a
forall s e. MonadThrow (Ribo s e)
forall e a.
Exception e =>
Ribo s e a -> (e -> Ribo s e a) -> Ribo s e a
forall s e e a.
Exception e =>
Ribo s e a -> (e -> Ribo s e a) -> Ribo s e a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: Ribo s e a -> (e -> Ribo s e a) -> Ribo s e a
$ccatch :: forall s e e a.
Exception e =>
Ribo s e a -> (e -> Ribo s e a) -> Ribo s e a
$cp1MonadCatch :: forall s e. MonadThrow (Ribo s e)
MonadCatch, MonadCatch (Ribo s e)
MonadCatch (Ribo s e)
-> (forall b.
    ((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b)
-> (forall b.
    ((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b)
-> (forall a b c.
    Ribo s e a
    -> (a -> ExitCase b -> Ribo s e c)
    -> (a -> Ribo s e b)
    -> Ribo s e (b, c))
-> MonadMask (Ribo s e)
Ribo s e a
-> (a -> ExitCase b -> Ribo s e c)
-> (a -> Ribo s e b)
-> Ribo s e (b, c)
((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
forall b.
((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
forall s e. MonadCatch (Ribo s e)
forall a b c.
Ribo s e a
-> (a -> ExitCase b -> Ribo s e c)
-> (a -> Ribo s e b)
-> Ribo s e (b, c)
forall s e b.
((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
forall s e a b c.
Ribo s e a
-> (a -> ExitCase b -> Ribo s e c)
-> (a -> Ribo s e b)
-> Ribo s e (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
    m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: Ribo s e a
-> (a -> ExitCase b -> Ribo s e c)
-> (a -> Ribo s e b)
-> Ribo s e (b, c)
$cgeneralBracket :: forall s e a b c.
Ribo s e a
-> (a -> ExitCase b -> Ribo s e c)
-> (a -> Ribo s e b)
-> Ribo s e (b, c)
uninterruptibleMask :: ((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
$cuninterruptibleMask :: forall s e b.
((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
mask :: ((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
$cmask :: forall s e b.
((forall a. Ribo s e a -> Ribo s e a) -> Ribo s e b) -> Ribo s e b
$cp1MonadMask :: forall s e. MonadCatch (Ribo s e)
MonadMask, Monad (Ribo s e)
Monad (Ribo s e)
-> (forall a. String -> Ribo s e a) -> MonadFail (Ribo s e)
String -> Ribo s e a
forall a. String -> Ribo s e a
forall s e. Monad (Ribo s e)
forall s e a. String -> Ribo s e a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> Ribo s e a
$cfail :: forall s e a. String -> Ribo s e a
$cp1MonadFail :: forall s e. Monad (Ribo s e)
MonadFail, MonadBase IO)

deriving newtype instance MonadError e (Ribo s e)

modifyTMVar ::
  MonadIO m =>
  (a -> a) ->
  TMVar a ->
  m a
modifyTMVar :: (a -> a) -> TMVar a -> m a
modifyTMVar a -> a
f TMVar a
tmvar = do
  a
a <- a -> a
f (a -> a) -> m a -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STM a -> m a
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (TMVar a -> STM a
forall a. TMVar a -> STM a
takeTMVar TMVar a
tmvar)
  STM () -> m ()
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM () -> m ()) -> STM () -> m ()
forall a b. (a -> b) -> a -> b
$ TMVar a -> a -> STM ()
forall a. TMVar a -> a -> STM ()
putTMVar TMVar a
tmvar a
a
  return a
a

safeModifyTMVarM ::
  MonadIO m =>
  MonadBaseControl IO m =>
  (a -> m a) ->
  TMVar a ->
  m a
safeModifyTMVarM :: (a -> m a) -> TMVar a -> m a
safeModifyTMVarM a -> m a
f TMVar a
tmvar =
  a -> m a
process (a -> m a) -> m a -> m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< STM a -> m a
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (TMVar a -> STM a
forall a. TMVar a -> STM a
takeTMVar TMVar a
tmvar)
  where
    process :: a -> m a
process a
a =
      m a -> m a -> m a
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
m a -> m b -> m a
onException (a -> m a
restore (a -> m a) -> m a -> m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< a -> m a
f a
a) (a -> m a
restore a
a)
    restore :: a -> m a
restore a
a =
      a
a a -> m () -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (STM () -> m ()
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM () -> m ()) -> (a -> STM ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TMVar a -> a -> STM ()
forall a. TMVar a -> a -> STM ()
putTMVar TMVar a
tmvar (a -> m ()) -> a -> m ()
forall a b. (a -> b) -> a -> b
$ a
a)

deriving newtype instance MonadReader (Ribosome s) (Ribo s e)

riboStateVar ::
  MonadReader (Ribosome s) m =>
  m (TMVar (RibosomeState s))
riboStateVar :: m (TMVar (RibosomeState s))
riboStateVar =
  (Ribosome s -> TMVar (RibosomeState s))
-> m (TMVar (RibosomeState s))
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
ReaderT.asks (Getting
  (TMVar (RibosomeState s)) (Ribosome s) (TMVar (RibosomeState s))
-> Ribosome s -> TMVar (RibosomeState s)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting
  (TMVar (RibosomeState s)) (Ribosome s) (TMVar (RibosomeState s))
forall c s. HasRibosome c s => Lens' c (TMVar (RibosomeState s))
Ribosome.state)

public ::
  DeepLenses s s' =>
  Lens' (RibosomeState s) s'
public :: Lens' (RibosomeState s) s'
public =
  (s -> f s) -> RibosomeState s -> f (RibosomeState s)
forall c s. HasRibosomeState c s => Lens' c s
RibosomeState.public ((s -> f s) -> RibosomeState s -> f (RibosomeState s))
-> ((s' -> f s') -> s -> f s)
-> (s' -> f s')
-> RibosomeState s
-> f (RibosomeState s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (s' -> f s') -> s -> f s
forall s s'. DeepLenses s s' => Lens' s s'
deepLens

instance DeepLenses s s' => MonadDeepState s s' (Ribo s e) where
  get :: Ribo s e s'
get =
    Getting s' (RibosomeState s) s' -> RibosomeState s -> s'
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting s' (RibosomeState s) s'
forall s s'. DeepLenses s s' => Lens' (RibosomeState s) s'
public (RibosomeState s -> s')
-> Ribo s e (RibosomeState s) -> Ribo s e s'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (STM (RibosomeState s) -> Ribo s e (RibosomeState s)
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM (RibosomeState s) -> Ribo s e (RibosomeState s))
-> (TMVar (RibosomeState s) -> STM (RibosomeState s))
-> TMVar (RibosomeState s)
-> Ribo s e (RibosomeState s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TMVar (RibosomeState s) -> STM (RibosomeState s)
forall a. TMVar a -> STM a
readTMVar (TMVar (RibosomeState s) -> Ribo s e (RibosomeState s))
-> Ribo s e (TMVar (RibosomeState s)) -> Ribo s e (RibosomeState s)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ribo s e (TMVar (RibosomeState s))
forall s (m :: * -> *).
MonadReader (Ribosome s) m =>
m (TMVar (RibosomeState s))
riboStateVar)

  modifyM' :: (s' -> Ribo s e s') -> Ribo s e s'
modifyM' s' -> Ribo s e s'
f =
    Getting s' (RibosomeState s) s' -> RibosomeState s -> s'
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting s' (RibosomeState s) s'
forall s s'. DeepLenses s s' => Lens' (RibosomeState s) s'
public (RibosomeState s -> s')
-> Ribo s e (RibosomeState s) -> Ribo s e s'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((RibosomeState s -> Ribo s e (RibosomeState s))
-> TMVar (RibosomeState s) -> Ribo s e (RibosomeState s)
forall (m :: * -> *) a.
(MonadIO m, MonadBaseControl IO m) =>
(a -> m a) -> TMVar a -> m a
safeModifyTMVarM RibosomeState s -> Ribo s e (RibosomeState s)
trans (TMVar (RibosomeState s) -> Ribo s e (RibosomeState s))
-> Ribo s e (TMVar (RibosomeState s)) -> Ribo s e (RibosomeState s)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ribo s e (TMVar (RibosomeState s))
forall s (m :: * -> *).
MonadReader (Ribosome s) m =>
m (TMVar (RibosomeState s))
riboStateVar)
    where
      trans :: RibosomeState s -> Ribo s e (RibosomeState s)
trans = LensLike
  (WrappedMonad (Ribo s e)) (RibosomeState s) (RibosomeState s) s' s'
-> (s' -> Ribo s e s')
-> RibosomeState s
-> Ribo s e (RibosomeState s)
forall (m :: * -> *) s t a b.
LensLike (WrappedMonad m) s t a b -> (a -> m b) -> s -> m t
Lens.mapMOf LensLike
  (WrappedMonad (Ribo s e)) (RibosomeState s) (RibosomeState s) s' s'
forall s s'. DeepLenses s s' => Lens' (RibosomeState s) s'
public s' -> Ribo s e s'
f

  put :: s' -> Ribo s e ()
put =
    (s' -> s') -> Ribo s e ()
forall s' s (m :: * -> *).
MonadDeepState s s' m =>
(s' -> s') -> m ()
modify ((s' -> s') -> Ribo s e ())
-> (s' -> s' -> s') -> s' -> Ribo s e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s' -> s' -> s'
forall a b. a -> b -> a
const

class Monad m => Nvim m where
  call :: Rpc c a => c -> m (Either RpcError a)

instance Nvim (Neovim e) where
  call :: c -> Neovim e (Either RpcError a)
call = c -> Neovim e (Either RpcError a)
forall c a e. Rpc c a => c -> Neovim e (Either RpcError a)
Rpc.call

instance (MonadTrans t, Monad (t m), Nvim m) => Nvim (t m) where
  call :: c -> t m (Either RpcError a)
call = m (Either RpcError a) -> t m (Either RpcError a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Either RpcError a) -> t m (Either RpcError a))
-> (c -> m (Either RpcError a)) -> c -> t m (Either RpcError a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> m (Either RpcError a)
forall (m :: * -> *) c a.
(Nvim m, Rpc c a) =>
c -> m (Either RpcError a)
call

instance Nvim (Ribo s e) where
  call :: c -> Ribo s e (Either RpcError a)
call = ExceptT e (RNeovim s) (Either RpcError a)
-> Ribo s e (Either RpcError a)
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo (ExceptT e (RNeovim s) (Either RpcError a)
 -> Ribo s e (Either RpcError a))
-> (c -> ExceptT e (RNeovim s) (Either RpcError a))
-> c
-> Ribo s e (Either RpcError a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> ExceptT e (RNeovim s) (Either RpcError a)
forall (m :: * -> *) c a.
(Nvim m, Rpc c a) =>
c -> m (Either RpcError a)
call

class (Nvim m, MonadDeepError e RpcError m) => NvimE e m where

instance DeepPrisms e RpcError => NvimE e (Ribo s e) where

instance (DeepPrisms e RpcError, Nvim m, Monad m) => NvimE e (ExceptT e m) where

instance (Functor f, MonadDeepError e RpcError m, Nvim m, Monad m) => NvimE e (FreeT f m) where

instance MonadBaseControl IO (Ribo s e) where
    type StM (Ribo s e) a = Either e a
    liftBaseWith :: (RunInBase (Ribo s e) IO -> IO a) -> Ribo s e a
liftBaseWith RunInBase (Ribo s e) IO -> IO a
f =
      ExceptT e (RNeovim s) a -> Ribo s e a
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo (ExceptT e (RNeovim s) a -> Ribo s e a)
-> ExceptT e (RNeovim s) a -> Ribo s e a
forall a b. (a -> b) -> a -> b
$ (RunInBase (ExceptT e (RNeovim s)) IO -> IO a)
-> ExceptT e (RNeovim s) a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
(RunInBase m b -> b a) -> m a
liftBaseWith ((RunInBase (ExceptT e (RNeovim s)) IO -> IO a)
 -> ExceptT e (RNeovim s) a)
-> (RunInBase (ExceptT e (RNeovim s)) IO -> IO a)
-> ExceptT e (RNeovim s) a
forall a b. (a -> b) -> a -> b
$ \ RunInBase (ExceptT e (RNeovim s)) IO
q -> RunInBase (Ribo s e) IO -> IO a
f (ExceptT e (RNeovim s) a -> IO (Either e a)
RunInBase (ExceptT e (RNeovim s)) IO
q (ExceptT e (RNeovim s) a -> IO (Either e a))
-> (Ribo s e a -> ExceptT e (RNeovim s) a)
-> Ribo s e a
-> IO (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ribo s e a -> ExceptT e (RNeovim s) a
forall s e a. Ribo s e a -> ExceptT e (RNeovim s) a
unRibo)
    {-# INLINABLE liftBaseWith #-}
    restoreM :: StM (Ribo s e) a -> Ribo s e a
restoreM =
      ExceptT e (RNeovim s) a -> Ribo s e a
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo (ExceptT e (RNeovim s) a -> Ribo s e a)
-> (Either e a -> ExceptT e (RNeovim s) a)
-> Either e a
-> Ribo s e a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either e a -> ExceptT e (RNeovim s) a
forall (b :: * -> *) (m :: * -> *) a.
MonadBaseControl b m =>
StM m a -> m a
restoreM
    {-# INLINABLE restoreM #-}

instance MonadResource (Ribo s e) where
    liftResourceT :: ResourceT IO a -> Ribo s e a
liftResourceT = ExceptT e (RNeovim s) a -> Ribo s e a
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo (ExceptT e (RNeovim s) a -> Ribo s e a)
-> (ResourceT IO a -> ExceptT e (RNeovim s) a)
-> ResourceT IO a
-> Ribo s e a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResourceT IO a -> ExceptT e (RNeovim s) a
forall (m :: * -> *) a. MonadResource m => ResourceT IO a -> m a
liftResourceT

instance RpcHandler e (Ribosome s) (Ribo s e) where
  native :: Ribo s e a -> ExceptT e (Neovim (Ribosome s)) a
native = Ribo s e a -> ExceptT e (Neovim (Ribosome s)) a
forall s e a. Ribo s e a -> ExceptT e (RNeovim s) a
runRiboE

acall :: (Monad m, Nvim m, Rpc c ()) => c -> m ()
acall :: c -> m ()
acall c
c = () -> Either RpcError () -> ()
forall b a. b -> Either a b -> b
fromRight () (Either RpcError () -> ()) -> m (Either RpcError ()) -> m ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> c -> m (Either RpcError ())
forall (m :: * -> *) c a.
(Nvim m, Rpc c a) =>
c -> m (Either RpcError a)
call c
c

readTv :: Lens' (RibosomeState s) s' -> TMVar (RibosomeState s) -> IO s'
readTv :: Lens' (RibosomeState s) s' -> TMVar (RibosomeState s) -> IO s'
readTv Lens' (RibosomeState s) s'
l TMVar (RibosomeState s)
t = Getting s' (RibosomeState s) s' -> RibosomeState s -> s'
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting s' (RibosomeState s) s'
Lens' (RibosomeState s) s'
l (RibosomeState s -> s') -> IO (RibosomeState s) -> IO s'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STM (RibosomeState s) -> IO (RibosomeState s)
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (TMVar (RibosomeState s) -> STM (RibosomeState s)
forall a. TMVar a -> STM a
readTMVar TMVar (RibosomeState s)
t)

runRibo :: Ribo s e a -> RNeovim s (Either e a)
runRibo :: Ribo s e a -> RNeovim s (Either e a)
runRibo =
  ExceptT e (RNeovim s) a -> RNeovim s (Either e a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT e (RNeovim s) a -> RNeovim s (Either e a))
-> (Ribo s e a -> ExceptT e (RNeovim s) a)
-> Ribo s e a
-> RNeovim s (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ribo s e a -> ExceptT e (RNeovim s) a
forall s e a. Ribo s e a -> ExceptT e (RNeovim s) a
unRibo

runRiboE :: Ribo s e a -> ExceptT e (RNeovim s) a
runRiboE :: Ribo s e a -> ExceptT e (RNeovim s) a
runRiboE =
  Ribo s e a -> ExceptT e (RNeovim s) a
forall s e a. Ribo s e a -> ExceptT e (RNeovim s) a
unRibo

class PluginName m where
  pluginName1 :: m Text

instance PluginName IO where
  pluginName1 :: IO Text
pluginName1 = Text -> IO Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
"io"

instance PluginName (RNeovim s) where
  pluginName1 :: RNeovim s Text
pluginName1 =
    (Ribosome s -> Text) -> RNeovim s Text
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
ReaderT.asks (Getting Text (Ribosome s) Text -> Ribosome s -> Text
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting Text (Ribosome s) Text
forall c s. HasRibosome c s => Lens' c Text
Ribosome.name)

class MonadIO m => MonadRibo m where
  pluginName :: m Text
  pluginInternal :: m RibosomeInternal
  pluginInternalModify :: (RibosomeInternal -> RibosomeInternal) -> m ()

pluginInternals :: MonadRibo m => (RibosomeInternal -> a) -> m a
pluginInternals :: (RibosomeInternal -> a) -> m a
pluginInternals = ((RibosomeInternal -> a) -> m RibosomeInternal -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m RibosomeInternal
forall (m :: * -> *). MonadRibo m => m RibosomeInternal
pluginInternal)

pluginInternalL :: MonadRibo m => Lens' RibosomeInternal a -> m a
pluginInternalL :: Lens' RibosomeInternal a -> m a
pluginInternalL = (RibosomeInternal -> a) -> m a
forall (m :: * -> *) a.
MonadRibo m =>
(RibosomeInternal -> a) -> m a
pluginInternals ((RibosomeInternal -> a) -> m a)
-> (Getting a RibosomeInternal a -> RibosomeInternal -> a)
-> Getting a RibosomeInternal a
-> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting a RibosomeInternal a -> RibosomeInternal -> a
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view

pluginInternalPut' :: MonadRibo m => RibosomeInternal -> m ()
pluginInternalPut' :: RibosomeInternal -> m ()
pluginInternalPut' RibosomeInternal
s =
  (RibosomeInternal -> RibosomeInternal) -> m ()
forall (m :: * -> *).
MonadRibo m =>
(RibosomeInternal -> RibosomeInternal) -> m ()
pluginInternalModify (RibosomeInternal -> RibosomeInternal -> RibosomeInternal
forall a b. a -> b -> a
const RibosomeInternal
s)

pluginInternalModifyL :: MonadRibo m => Lens' RibosomeInternal a -> (a -> a) -> m ()
pluginInternalModifyL :: Lens' RibosomeInternal a -> (a -> a) -> m ()
pluginInternalModifyL Lens' RibosomeInternal a
l a -> a
f =
  (RibosomeInternal -> RibosomeInternal) -> m ()
forall (m :: * -> *).
MonadRibo m =>
(RibosomeInternal -> RibosomeInternal) -> m ()
pluginInternalModify ((RibosomeInternal -> RibosomeInternal) -> m ())
-> (RibosomeInternal -> RibosomeInternal) -> m ()
forall a b. (a -> b) -> a -> b
$ ASetter RibosomeInternal RibosomeInternal a a
-> (a -> a) -> RibosomeInternal -> RibosomeInternal
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ASetter RibosomeInternal RibosomeInternal a a
Lens' RibosomeInternal a
l a -> a
f

instance MonadRibo (RNeovim s) where
  pluginName :: RNeovim s Text
pluginName =
    (Ribosome s -> Text) -> RNeovim s Text
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
ReaderT.asks (Getting Text (Ribosome s) Text -> Ribosome s -> Text
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting Text (Ribosome s) Text
forall c s. HasRibosome c s => Lens' c Text
Ribosome.name)

  pluginInternal :: RNeovim s RibosomeInternal
pluginInternal =
    Getting RibosomeInternal (RibosomeState s) RibosomeInternal
-> RibosomeState s -> RibosomeInternal
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting RibosomeInternal (RibosomeState s) RibosomeInternal
forall c s. HasRibosomeState c s => Lens' c RibosomeInternal
RibosomeState.internal (RibosomeState s -> RibosomeInternal)
-> (TMVar (RibosomeState s)
    -> Neovim (Ribosome s) (RibosomeState s))
-> TMVar (RibosomeState s)
-> RNeovim s RibosomeInternal
forall (f0 :: * -> *) (f1 :: * -> *) a b.
(Functor f0, Functor f1) =>
(a -> b) -> f1 (f0 a) -> f1 (f0 b)
<$$> STM (RibosomeState s) -> Neovim (Ribosome s) (RibosomeState s)
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM (RibosomeState s) -> Neovim (Ribosome s) (RibosomeState s))
-> (TMVar (RibosomeState s) -> STM (RibosomeState s))
-> TMVar (RibosomeState s)
-> Neovim (Ribosome s) (RibosomeState s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TMVar (RibosomeState s) -> STM (RibosomeState s)
forall a. TMVar a -> STM a
readTMVar (TMVar (RibosomeState s) -> RNeovim s RibosomeInternal)
-> Neovim (Ribosome s) (TMVar (RibosomeState s))
-> RNeovim s RibosomeInternal
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Ribosome s -> TMVar (RibosomeState s))
-> Neovim (Ribosome s) (TMVar (RibosomeState s))
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
ReaderT.asks (Getting
  (TMVar (RibosomeState s)) (Ribosome s) (TMVar (RibosomeState s))
-> Ribosome s -> TMVar (RibosomeState s)
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting
  (TMVar (RibosomeState s)) (Ribosome s) (TMVar (RibosomeState s))
forall c s. HasRibosome c s => Lens' c (TMVar (RibosomeState s))
Ribosome.state)

  pluginInternalModify :: (RibosomeInternal -> RibosomeInternal) -> RNeovim s ()
pluginInternalModify RibosomeInternal -> RibosomeInternal
f =
    Neovim (Ribosome s) (RibosomeState s) -> RNeovim s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Neovim (Ribosome s) (RibosomeState s) -> RNeovim s ())
-> (TMVar (RibosomeState s)
    -> Neovim (Ribosome s) (RibosomeState s))
-> TMVar (RibosomeState s)
-> RNeovim s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RibosomeState s -> RibosomeState s)
-> TMVar (RibosomeState s) -> Neovim (Ribosome s) (RibosomeState s)
forall (m :: * -> *) a. MonadIO m => (a -> a) -> TMVar a -> m a
modifyTMVar (ASetter
  (RibosomeState s)
  (RibosomeState s)
  RibosomeInternal
  RibosomeInternal
-> (RibosomeInternal -> RibosomeInternal)
-> RibosomeState s
-> RibosomeState s
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ASetter
  (RibosomeState s)
  (RibosomeState s)
  RibosomeInternal
  RibosomeInternal
forall c s. HasRibosomeState c s => Lens' c RibosomeInternal
RibosomeState.internal RibosomeInternal -> RibosomeInternal
f) (TMVar (RibosomeState s) -> RNeovim s ())
-> Neovim (Ribosome s) (TMVar (RibosomeState s)) -> RNeovim s ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Neovim (Ribosome s) (TMVar (RibosomeState s))
forall s (m :: * -> *).
MonadReader (Ribosome s) m =>
m (TMVar (RibosomeState s))
riboStateVar

instance MonadRibo (Ribo s e) where
  pluginName :: Ribo s e Text
pluginName = ExceptT e (RNeovim s) Text -> Ribo s e Text
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo ExceptT e (RNeovim s) Text
forall (m :: * -> *). MonadRibo m => m Text
pluginName
  pluginInternal :: Ribo s e RibosomeInternal
pluginInternal = ExceptT e (RNeovim s) RibosomeInternal -> Ribo s e RibosomeInternal
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo ExceptT e (RNeovim s) RibosomeInternal
forall (m :: * -> *). MonadRibo m => m RibosomeInternal
pluginInternal
  pluginInternalModify :: (RibosomeInternal -> RibosomeInternal) -> Ribo s e ()
pluginInternalModify = ExceptT e (RNeovim s) () -> Ribo s e ()
forall s e a. ExceptT e (RNeovim s) a -> Ribo s e a
Ribo (ExceptT e (RNeovim s) () -> Ribo s e ())
-> ((RibosomeInternal -> RibosomeInternal)
    -> ExceptT e (RNeovim s) ())
-> (RibosomeInternal -> RibosomeInternal)
-> Ribo s e ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RibosomeInternal -> RibosomeInternal) -> ExceptT e (RNeovim s) ()
forall (m :: * -> *).
MonadRibo m =>
(RibosomeInternal -> RibosomeInternal) -> m ()
pluginInternalModify

instance {-# OVERLAPPABLE #-} (MonadTrans t, MonadIO (t m), MonadRibo m) => MonadRibo (t m) where
  pluginName :: t m Text
pluginName = m Text -> t m Text
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m Text
forall (m :: * -> *). MonadRibo m => m Text
pluginName
  pluginInternal :: t m RibosomeInternal
pluginInternal = m RibosomeInternal -> t m RibosomeInternal
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m RibosomeInternal
forall (m :: * -> *). MonadRibo m => m RibosomeInternal
pluginInternal
  pluginInternalModify :: (RibosomeInternal -> RibosomeInternal) -> t m ()
pluginInternalModify = m () -> t m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> t m ())
-> ((RibosomeInternal -> RibosomeInternal) -> m ())
-> (RibosomeInternal -> RibosomeInternal)
-> t m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RibosomeInternal -> RibosomeInternal) -> m ()
forall (m :: * -> *).
MonadRibo m =>
(RibosomeInternal -> RibosomeInternal) -> m ()
pluginInternalModify

instance {-# OVERLAPPING #-} MonadIO m => MonadRibo (StateT (StrictRibosome s) m) where
  pluginName :: StateT (StrictRibosome s) m Text
pluginName =
    (StrictRibosome s -> Text) -> StateT (StrictRibosome s) m Text
forall (m :: * -> *) s a. Monad m => (s -> a) -> StateT s m a
StateT.gets (Getting Text (StrictRibosome s) Text -> StrictRibosome s -> Text
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting Text (StrictRibosome s) Text
forall c s. HasStrictRibosome c s => Lens' c Text
StrictRibosome.name)
  pluginInternal :: StateT (StrictRibosome s) m RibosomeInternal
pluginInternal =
    (StrictRibosome s -> RibosomeInternal)
-> StateT (StrictRibosome s) m RibosomeInternal
forall (m :: * -> *) s a. Monad m => (s -> a) -> StateT s m a
StateT.gets (Getting RibosomeInternal (StrictRibosome s) RibosomeInternal
-> StrictRibosome s -> RibosomeInternal
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view (Getting RibosomeInternal (StrictRibosome s) RibosomeInternal
 -> StrictRibosome s -> RibosomeInternal)
-> Getting RibosomeInternal (StrictRibosome s) RibosomeInternal
-> StrictRibosome s
-> RibosomeInternal
forall a b. (a -> b) -> a -> b
$ (RibosomeState s -> Const RibosomeInternal (RibosomeState s))
-> StrictRibosome s -> Const RibosomeInternal (StrictRibosome s)
forall c s. HasStrictRibosome c s => Lens' c (RibosomeState s)
StrictRibosome.state ((RibosomeState s -> Const RibosomeInternal (RibosomeState s))
 -> StrictRibosome s -> Const RibosomeInternal (StrictRibosome s))
-> ((RibosomeInternal -> Const RibosomeInternal RibosomeInternal)
    -> RibosomeState s -> Const RibosomeInternal (RibosomeState s))
-> Getting RibosomeInternal (StrictRibosome s) RibosomeInternal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RibosomeInternal -> Const RibosomeInternal RibosomeInternal)
-> RibosomeState s -> Const RibosomeInternal (RibosomeState s)
forall c s. HasRibosomeState c s => Lens' c RibosomeInternal
RibosomeState.internal)
  pluginInternalModify :: (RibosomeInternal -> RibosomeInternal)
-> StateT (StrictRibosome s) m ()
pluginInternalModify =
    (StrictRibosome s -> StrictRibosome s)
-> StateT (StrictRibosome s) m ()
forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
StateT.modify ((StrictRibosome s -> StrictRibosome s)
 -> StateT (StrictRibosome s) m ())
-> ((RibosomeInternal -> RibosomeInternal)
    -> StrictRibosome s -> StrictRibosome s)
-> (RibosomeInternal -> RibosomeInternal)
-> StateT (StrictRibosome s) m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ASetter
  (StrictRibosome s)
  (StrictRibosome s)
  RibosomeInternal
  RibosomeInternal
-> (RibosomeInternal -> RibosomeInternal)
-> StrictRibosome s
-> StrictRibosome s
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ((RibosomeState s -> Identity (RibosomeState s))
-> StrictRibosome s -> Identity (StrictRibosome s)
forall c s. HasStrictRibosome c s => Lens' c (RibosomeState s)
StrictRibosome.state ((RibosomeState s -> Identity (RibosomeState s))
 -> StrictRibosome s -> Identity (StrictRibosome s))
-> ((RibosomeInternal -> Identity RibosomeInternal)
    -> RibosomeState s -> Identity (RibosomeState s))
-> ASetter
     (StrictRibosome s)
     (StrictRibosome s)
     RibosomeInternal
     RibosomeInternal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RibosomeInternal -> Identity RibosomeInternal)
-> RibosomeState s -> Identity (RibosomeState s)
forall c s. HasRibosomeState c s => Lens' c RibosomeInternal
RibosomeState.internal)

getErrors :: MonadRibo m => m Errors
getErrors :: m Errors
getErrors =
  (RibosomeInternal -> Errors) -> m Errors
forall (m :: * -> *) a.
MonadRibo m =>
(RibosomeInternal -> a) -> m a
pluginInternals RibosomeInternal -> Errors
Ribosome._errors

inspectErrors :: MonadRibo m => (Errors -> a) -> m a
inspectErrors :: (Errors -> a) -> m a
inspectErrors = ((Errors -> a) -> m Errors -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Errors
forall (m :: * -> *). MonadRibo m => m Errors
getErrors)

modifyErrors :: MonadRibo m => (Errors -> Errors) -> m ()
modifyErrors :: (Errors -> Errors) -> m ()
modifyErrors =
  Lens' RibosomeInternal Errors -> (Errors -> Errors) -> m ()
forall (m :: * -> *) a.
MonadRibo m =>
Lens' RibosomeInternal a -> (a -> a) -> m ()
pluginInternalModifyL forall c. HasRibosomeInternal c => Lens' c Errors
Lens' RibosomeInternal Errors
Ribosome.errors

prepend :: s' s m a. MonadDeepState s s' m => Lens' s' [a] -> a -> m ()
prepend :: Lens' s' [a] -> a -> m ()
prepend Lens' s' [a]
lens a
a =
  (s' -> s') -> m ()
forall s' s (m :: * -> *).
MonadDeepState s s' m =>
(s' -> s') -> m ()
modify ((s' -> s') -> m ()) -> (s' -> s') -> m ()
forall a b. (a -> b) -> a -> b
$ ASetter s' s' [a] [a] -> ([a] -> [a]) -> s' -> s'
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ASetter s' s' [a] [a]
Lens' s' [a]
lens (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:)

prependUnique ::
   s' s m a .
  Eq a =>
  MonadDeepState s s' m =>
  Lens' s' [a] ->
  a ->
  m ()
prependUnique :: Lens' s' [a] -> a -> m ()
prependUnique Lens' s' [a]
lens a
a =
  (s' -> s') -> m ()
forall s' s (m :: * -> *).
MonadDeepState s s' m =>
(s' -> s') -> m ()
modify ((s' -> s') -> m ()) -> (s' -> s') -> m ()
forall a b. (a -> b) -> a -> b
$ ASetter s' s' [a] [a] -> ([a] -> [a]) -> s' -> s'
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ASetter s' s' [a] [a]
Lens' s' [a]
lens [a] -> [a]
modder
  where
    modder :: [a] -> [a]
modder [a]
as =
      a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter (a
a a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/=) [a]
as

prependUniqueBy ::
   s' s m a b .
  Eq b =>
  MonadDeepState s s' m =>
  Lens' a b ->
  Lens' s' [a] ->
  a ->
  m ()
prependUniqueBy :: Lens' a b -> Lens' s' [a] -> a -> m ()
prependUniqueBy Lens' a b
attr Lens' s' [a]
lens a
a =
  (s' -> s') -> m ()
forall s' s (m :: * -> *).
MonadDeepState s s' m =>
(s' -> s') -> m ()
modify ((s' -> s') -> m ()) -> (s' -> s') -> m ()
forall a b. (a -> b) -> a -> b
$ ASetter s' s' [a] [a] -> ([a] -> [a]) -> s' -> s'
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
Lens.over ASetter s' s' [a] [a]
Lens' s' [a]
lens [a] -> [a]
modder
  where
    modder :: [a] -> [a]
modder [a]
as =
      a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
pred' [a]
as
    pred' :: a -> Bool
pred' a
b =
      Getting b a b -> a -> b
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting b a b
Lens' a b
attr a
a b -> b -> Bool
forall a. Eq a => a -> a -> Bool
/= Getting b a b -> a -> b
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting b a b
Lens' a b
attr a
b

inspectHeadE ::
   s' s e e' m a .
  (MonadDeepState s s' m, MonadDeepError e e' m) =>
  e' ->
  Lens' s' [a] ->
  m a
inspectHeadE :: e' -> Lens' s' [a] -> m a
inspectHeadE e'
err Lens' s' [a]
lens = do
  [a]
as <- (s' -> [a]) -> m [a]
forall s' s (m :: * -> *) a.
MonadDeepState s s' m =>
(s' -> a) -> m a
gets ((s' -> [a]) -> m [a]) -> (s' -> [a]) -> m [a]
forall a b. (a -> b) -> a -> b
$ Getting [a] s' [a] -> s' -> [a]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
Lens.view Getting [a] s' [a]
Lens' s' [a]
lens
  case [a]
as of
    (a
a : [a]
_) -> a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
    [a]
_ -> e' -> m a
forall e e' (m :: * -> *) a. MonadDeepError e e' m => e' -> m a
throwHoist e'
err