{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Neovim.User.Choice
where
import Neovim
import Neovim.API.String
import Data.Char (toLower)
import Data.List (isPrefixOf)
oneOf :: [String] -> Neovim env (Maybe String)
oneOf :: forall env. [String] -> Neovim env (Maybe String)
oneOf [String]
cs = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
i -> [String]
cs forall a. [a] -> Int -> a
!! (Int
iforall a. Num a => a -> a -> a
-Int
1)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall env. [Object] -> Neovim env (Maybe Int)
askForIndex (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith String -> Int -> Object
mkChoice [String]
cs [Int
1..])
where
mkChoice :: String -> Int -> Object
mkChoice :: String -> Int -> Object
mkChoice String
c Int
i = forall o. NvimObject o => o -> Object
toObject forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show Int
i forall a. Semigroup a => a -> a -> a
<> String
". " forall a. Semigroup a => a -> a -> a
<> String
c
askForIndex :: [Object] -> Neovim env (Maybe Int)
askForIndex :: forall env. [Object] -> Neovim env (Maybe Int)
askForIndex [Object]
cs = forall env. String -> [Object] -> Neovim env Object
vim_call_function String
"inputlist" [[Object] -> Object
ObjectArray [Object]
cs] forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Object
a -> case forall o. NvimObject o => Object -> Either (Doc AnsiStyle) o
fromObject Object
a of
Right Int
i | Int
i forall a. Ord a => a -> a -> Bool
>= Int
1 Bool -> Bool -> Bool
&& Int
i forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length [Object]
cs ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Int
i
Right Int
_ ->
forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
Left Doc AnsiStyle
e ->
forall env a. Doc AnsiStyle -> Neovim env a
err Doc AnsiStyle
e
oneOfS :: Show a => [a] -> Neovim env (Maybe a)
oneOfS :: forall a env. Show a => [a] -> Neovim env (Maybe a)
oneOfS [a]
cs = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
i -> [a]
cs forall a. [a] -> Int -> a
!! (Int
iforall a. Num a => a -> a -> a
-Int
1)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall env. [Object] -> Neovim env (Maybe Int)
askForIndex (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall {a}. Show a => a -> Int -> Object
mkChoice [a]
cs [Int
1..])
where
mkChoice :: a -> Int -> Object
mkChoice a
c Int
i = forall o. NvimObject o => o -> Object
toObject forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show (Int
i :: Int) forall a. [a] -> [a] -> [a]
++ String
". " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
c
yesOrNo :: String
-> Neovim env Bool
yesOrNo :: forall env. String -> Neovim env Bool
yesOrNo String
message = do
Object
spec <- forall env. String -> [Object] -> Neovim env Object
vim_call_function
String
"inputdialog" forall a b. (a -> b) -> a -> b
$ (String
message forall a. [a] -> [a] -> [a]
++ String
" (Y/n) ")
forall o. NvimObject o => o -> [Object] -> [Object]
+: (String
"" :: String) forall o. NvimObject o => o -> [Object] -> [Object]
+: (String
"no" :: String) forall o. NvimObject o => o -> [Object] -> [Object]
+: []
case forall o. NvimObject o => Object -> Either (Doc AnsiStyle) o
fromObject Object
spec of
Right String
s | forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
s forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
"yes" ->
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
Right String
s | forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
s forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
"no" ->
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
Left Doc AnsiStyle
e ->
forall env a. Doc AnsiStyle -> Neovim env a
err Doc AnsiStyle
e
Either (Doc AnsiStyle) String
_ ->
forall env. String -> Neovim env Bool
yesOrNo String
message