{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternGuards #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Yi.Mode.Haskell.Dollarify where
import Control.Monad (unless)
import Data.Function (on)
import Data.List (sortBy)
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))
import Data.Text ()
import Yi.Buffer hiding (Block)
import Yi.Debug (trace)
import Yi.Lexer.Alex (Tok (..), posnOfs)
import Yi.Lexer.Haskell (TT, Token (..), isComment)
import qualified Yi.Rope as R (YiString, null)
import Yi.String (showT)
import qualified Yi.Syntax.Haskell as H (Exp (..), Tree)
import Yi.Syntax.Paren (Expr, Tree (..))
import Yi.Syntax.Tree (getAllSubTrees, getFirstOffset, getLastOffset, getLastPath)
dollarify :: Tree TT -> BufferM ()
dollarify :: Tree (Tok Token) -> BufferM ()
dollarify Tree (Tok Token)
t = BufferM ()
-> (Tree (Tok Token) -> BufferM ())
-> Maybe (Tree (Tok Token))
-> BufferM ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> BufferM ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()) Tree (Tok Token) -> BufferM ()
dollarifyWithin (Maybe (Tree (Tok Token)) -> BufferM ())
-> (Region -> Maybe (Tree (Tok Token))) -> Region -> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tree (Tok Token)] -> Region -> Maybe (Tree (Tok Token))
selectedTree [Tree (Tok Token)
t] (Region -> BufferM ()) -> BufferM Region -> BufferM ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< BufferM Region
getSelectRegionB
dollarifyWithin :: Tree TT -> BufferM ()
dollarifyWithin :: Tree (Tok Token) -> BufferM ()
dollarifyWithin = Text -> BufferM () -> BufferM ()
forall a. Text -> a -> a
trace (Text -> BufferM () -> BufferM ())
-> (Tree (Tok Token) -> Text)
-> Tree (Tok Token)
-> BufferM ()
-> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text
"dollarifyWithin: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (Text -> Text)
-> (Tree (Tok Token) -> Text) -> Tree (Tok Token) -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tree (Tok Token) -> Text
forall a. Show a => a -> Text
showT (Tree (Tok Token) -> BufferM () -> BufferM ())
-> (Tree (Tok Token) -> BufferM ())
-> Tree (Tok Token)
-> BufferM ()
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [QueuedUpdate] -> BufferM ()
runQ ([QueuedUpdate] -> BufferM ())
-> (Tree (Tok Token) -> [QueuedUpdate])
-> Tree (Tok Token)
-> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tree (Tok Token) -> [QueuedUpdate]
dollarifyTop (Tree (Tok Token) -> [QueuedUpdate])
-> [Tree (Tok Token)] -> [QueuedUpdate]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) ([Tree (Tok Token)] -> [QueuedUpdate])
-> (Tree (Tok Token) -> [Tree (Tok Token)])
-> Tree (Tok Token)
-> [QueuedUpdate]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tree (Tok Token) -> [Tree (Tok Token)]
forall (tree :: * -> *) t. IsTree tree => tree t -> [tree t]
getAllSubTrees
data QueuedUpdate = QueuedUpdate { QueuedUpdate -> Point
qUpdatePoint :: Point
, QueuedUpdate -> YiString
qInsert :: R.YiString
, QueuedUpdate -> Int
qDelete :: Int
} deriving (QueuedUpdate -> QueuedUpdate -> Bool
(QueuedUpdate -> QueuedUpdate -> Bool)
-> (QueuedUpdate -> QueuedUpdate -> Bool) -> Eq QueuedUpdate
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QueuedUpdate -> QueuedUpdate -> Bool
$c/= :: QueuedUpdate -> QueuedUpdate -> Bool
== :: QueuedUpdate -> QueuedUpdate -> Bool
$c== :: QueuedUpdate -> QueuedUpdate -> Bool
Eq, Eq QueuedUpdate
Eq QueuedUpdate
-> (QueuedUpdate -> QueuedUpdate -> Ordering)
-> (QueuedUpdate -> QueuedUpdate -> Bool)
-> (QueuedUpdate -> QueuedUpdate -> Bool)
-> (QueuedUpdate -> QueuedUpdate -> Bool)
-> (QueuedUpdate -> QueuedUpdate -> Bool)
-> (QueuedUpdate -> QueuedUpdate -> QueuedUpdate)
-> (QueuedUpdate -> QueuedUpdate -> QueuedUpdate)
-> Ord QueuedUpdate
QueuedUpdate -> QueuedUpdate -> Bool
QueuedUpdate -> QueuedUpdate -> Ordering
QueuedUpdate -> QueuedUpdate -> QueuedUpdate
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: QueuedUpdate -> QueuedUpdate -> QueuedUpdate
$cmin :: QueuedUpdate -> QueuedUpdate -> QueuedUpdate
max :: QueuedUpdate -> QueuedUpdate -> QueuedUpdate
$cmax :: QueuedUpdate -> QueuedUpdate -> QueuedUpdate
>= :: QueuedUpdate -> QueuedUpdate -> Bool
$c>= :: QueuedUpdate -> QueuedUpdate -> Bool
> :: QueuedUpdate -> QueuedUpdate -> Bool
$c> :: QueuedUpdate -> QueuedUpdate -> Bool
<= :: QueuedUpdate -> QueuedUpdate -> Bool
$c<= :: QueuedUpdate -> QueuedUpdate -> Bool
< :: QueuedUpdate -> QueuedUpdate -> Bool
$c< :: QueuedUpdate -> QueuedUpdate -> Bool
compare :: QueuedUpdate -> QueuedUpdate -> Ordering
$ccompare :: QueuedUpdate -> QueuedUpdate -> Ordering
Ord, Int -> QueuedUpdate -> ShowS
[QueuedUpdate] -> ShowS
QueuedUpdate -> String
(Int -> QueuedUpdate -> ShowS)
-> (QueuedUpdate -> String)
-> ([QueuedUpdate] -> ShowS)
-> Show QueuedUpdate
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QueuedUpdate] -> ShowS
$cshowList :: [QueuedUpdate] -> ShowS
show :: QueuedUpdate -> String
$cshow :: QueuedUpdate -> String
showsPrec :: Int -> QueuedUpdate -> ShowS
$cshowsPrec :: Int -> QueuedUpdate -> ShowS
Show)
runQ :: [QueuedUpdate] -> BufferM ()
runQ :: [QueuedUpdate] -> BufferM ()
runQ = Text -> BufferM () -> BufferM ()
forall a. Text -> a -> a
trace (Text -> BufferM () -> BufferM ())
-> ([QueuedUpdate] -> Text)
-> [QueuedUpdate]
-> BufferM ()
-> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text
"runQ: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (Text -> Text)
-> ([QueuedUpdate] -> Text) -> [QueuedUpdate] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [QueuedUpdate] -> Text
forall a. Show a => a -> Text
showT ([QueuedUpdate] -> BufferM () -> BufferM ())
-> ([QueuedUpdate] -> BufferM ()) -> [QueuedUpdate] -> BufferM ()
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (QueuedUpdate -> BufferM ()) -> [QueuedUpdate] -> BufferM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ QueuedUpdate -> BufferM ()
run1Q ([QueuedUpdate] -> BufferM ())
-> ([QueuedUpdate] -> [QueuedUpdate])
-> [QueuedUpdate]
-> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (QueuedUpdate -> QueuedUpdate -> Ordering)
-> [QueuedUpdate] -> [QueuedUpdate]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy ((QueuedUpdate -> QueuedUpdate -> Ordering)
-> QueuedUpdate -> QueuedUpdate -> Ordering
forall a b c. (a -> b -> c) -> b -> a -> c
flip QueuedUpdate -> QueuedUpdate -> Ordering
forall a. Ord a => a -> a -> Ordering
compare)
where
run1Q :: QueuedUpdate -> BufferM ()
run1Q :: QueuedUpdate -> BufferM ()
run1Q (QueuedUpdate { qUpdatePoint :: QueuedUpdate -> Point
qUpdatePoint = Point
p, qInsert :: QueuedUpdate -> YiString
qInsert = YiString
i, qDelete :: QueuedUpdate -> Int
qDelete = Int
d })
= do Direction -> Int -> Point -> BufferM ()
deleteNAt Direction
Forward Int
d Point
p
Bool -> BufferM () -> BufferM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (YiString -> Bool
R.null YiString
i) (BufferM () -> BufferM ()) -> BufferM () -> BufferM ()
forall a b. (a -> b) -> a -> b
$ YiString -> Point -> BufferM ()
insertNAt YiString
i Point
p
openParen, closeParen :: Token
openParen :: Token
openParen = Char -> Token
Special Char
'('
closeParen :: Token
closeParen = Char -> Token
Special Char
')'
isNormalParen :: Tree TT -> Bool
isNormalParen :: Tree (Tok Token) -> Bool
isNormalParen (Paren Tok Token
t1 [Tree (Tok Token)]
xs Tok Token
t2) =
Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
t1 Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
openParen Bool -> Bool -> Bool
&& Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
t2 Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
closeParen Bool -> Bool -> Bool
&& Bool -> Bool
not ((Tree (Tok Token) -> Bool) -> [Tree (Tok Token)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Tree (Tok Token) -> Bool
isTuple [Tree (Tok Token)]
xs)
isNormalParen Tree (Tok Token)
_ = Bool
False
isTuple ::Tree TT -> Bool
isTuple :: Tree (Tok Token) -> Bool
isTuple (Atom Tok Token
t) = Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
t Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Special Char
','
isTuple Tree (Tok Token)
_ = Bool
False
queueDelete :: TT -> QueuedUpdate
queueDelete :: Tok Token -> QueuedUpdate
queueDelete = YiString -> Tok Token -> QueuedUpdate
queueReplaceWith YiString
""
queueReplaceWith :: R.YiString -> TT -> QueuedUpdate
queueReplaceWith :: YiString -> Tok Token -> QueuedUpdate
queueReplaceWith YiString
s Tok Token
t = QueuedUpdate :: Point -> YiString -> Int -> QueuedUpdate
QueuedUpdate { qUpdatePoint :: Point
qUpdatePoint = Posn -> Point
posnOfs (Posn -> Point) -> Posn -> Point
forall a b. (a -> b) -> a -> b
$ Tok Token -> Posn
forall t. Tok t -> Posn
tokPosn Tok Token
t
, qInsert :: YiString
qInsert = YiString
s
, qDelete :: Int
qDelete = Int
1
}
stripComments :: Expr TT -> Expr TT
= (Tree (Tok Token) -> Bool)
-> [Tree (Tok Token)] -> [Tree (Tok Token)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Tree (Tok Token) -> Bool)
-> [Tree (Tok Token)] -> [Tree (Tok Token)])
-> (Tree (Tok Token) -> Bool)
-> [Tree (Tok Token)]
-> [Tree (Tok Token)]
forall a b. (a -> b) -> a -> b
$ \Tree (Tok Token)
t -> case Tree (Tok Token)
t of { (Atom Tok Token
x) -> Bool -> Bool
not (Token -> Bool
isComment (Token -> Bool) -> Token -> Bool
forall a b. (a -> b) -> a -> b
$ Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
x); Tree (Tok Token)
_ -> Bool
True }
dollarifyTop :: Tree TT -> [QueuedUpdate]
dollarifyTop :: Tree (Tok Token) -> [QueuedUpdate]
dollarifyTop p :: Tree (Tok Token)
p@(Paren Tok Token
t1 [Tree (Tok Token)]
e Tok Token
t2)
| Tree (Tok Token) -> Bool
isNormalParen Tree (Tok Token)
p = case [Tree (Tok Token)] -> [Tree (Tok Token)]
stripComments [Tree (Tok Token)]
e of
[Paren{}] -> [Tok Token -> QueuedUpdate
queueDelete Tok Token
t2, Tok Token -> QueuedUpdate
queueDelete Tok Token
t1]
[Tree (Tok Token)]
e' -> [Tree (Tok Token)] -> [QueuedUpdate]
dollarifyExpr [Tree (Tok Token)]
e'
dollarifyTop (Block [Tree (Tok Token)]
blk) = [Tree (Tok Token)] -> [QueuedUpdate]
dollarifyExpr ([Tree (Tok Token)] -> [QueuedUpdate])
-> ([Tree (Tok Token)] -> [Tree (Tok Token)])
-> [Tree (Tok Token)]
-> [QueuedUpdate]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tree (Tok Token)] -> [Tree (Tok Token)]
stripComments ([Tree (Tok Token)] -> [QueuedUpdate])
-> [[Tree (Tok Token)]] -> [QueuedUpdate]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [[Tree (Tok Token)]
x | Expr [Tree (Tok Token)]
x <- [Tree (Tok Token)]
blk]
dollarifyTop Tree (Tok Token)
_ = []
dollarifyExpr :: Expr TT -> [QueuedUpdate]
dollarifyExpr :: [Tree (Tok Token)] -> [QueuedUpdate]
dollarifyExpr e :: [Tree (Tok Token)]
e@(Tree (Tok Token)
_:[Tree (Tok Token)]
_)
| p :: Tree (Tok Token)
p@(Paren Tok Token
t [Tree (Tok Token)]
e2 Tok Token
t2) <- [Tree (Tok Token)] -> Tree (Tok Token)
forall a. [a] -> a
last [Tree (Tok Token)]
e
, Tree (Tok Token) -> Bool
isNormalParen Tree (Tok Token)
p
, (Tree (Tok Token) -> Bool) -> [Tree (Tok Token)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Tree (Tok Token) -> Bool
isSimple [Tree (Tok Token)]
e
= let dollarifyLoop :: Expr TT -> [QueuedUpdate]
dollarifyLoop :: [Tree (Tok Token)] -> [QueuedUpdate]
dollarifyLoop [] = []
dollarifyLoop e3 :: [Tree (Tok Token)]
e3@[Paren{}] = [Tree (Tok Token)] -> [QueuedUpdate]
dollarifyExpr [Tree (Tok Token)]
e3
dollarifyLoop [Tree (Tok Token)]
e3 = if [Tree (Tok Token)] -> Bool
isCollapsible [Tree (Tok Token)]
e3 then [Tok Token -> QueuedUpdate
queueDelete Tok Token
t2, YiString -> Tok Token -> QueuedUpdate
queueReplaceWith YiString
"$ " Tok Token
t] else []
in [Tree (Tok Token)] -> [QueuedUpdate]
dollarifyLoop ([Tree (Tok Token)] -> [QueuedUpdate])
-> [Tree (Tok Token)] -> [QueuedUpdate]
forall a b. (a -> b) -> a -> b
$ [Tree (Tok Token)] -> [Tree (Tok Token)]
stripComments [Tree (Tok Token)]
e2
dollarifyExpr [Tree (Tok Token)]
_ = []
isSimple :: Tree TT -> Bool
isSimple :: Tree (Tok Token) -> Bool
isSimple (Paren{}) = Bool
True
isSimple (Block{}) = Bool
False
isSimple (Atom Tok Token
t) = Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
t Token -> [Token] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Token
Number, Token
CharTok, Token
StringTok, Token
VarIdent, Token
ConsIdent]
isSimple Tree (Tok Token)
_ = Bool
False
isCollapsible :: Expr TT -> Bool
isCollapsible :: [Tree (Tok Token)] -> Bool
isCollapsible = (Bool -> Bool -> Bool
(&&) (Bool -> Bool -> Bool)
-> (Tree (Tok Token) -> Bool)
-> Tree (Tok Token)
-> Tree (Tok Token)
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Tree (Tok Token) -> Bool
isSimple) (Tree (Tok Token) -> Tree (Tok Token) -> Bool)
-> ([Tree (Tok Token)] -> Tree (Tok Token))
-> [Tree (Tok Token)]
-> Tree (Tok Token)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tree (Tok Token)] -> Tree (Tok Token)
forall a. [a] -> a
head ([Tree (Tok Token)] -> Tree (Tok Token) -> Bool)
-> ([Tree (Tok Token)] -> Tree (Tok Token))
-> [Tree (Tok Token)]
-> Bool
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Tree (Tok Token)] -> Tree (Tok Token)
forall a. [a] -> a
last
selectedTree :: Expr TT -> Region -> Maybe (Tree TT)
selectedTree :: [Tree (Tok Token)] -> Region -> Maybe (Tree (Tok Token))
selectedTree [Tree (Tok Token)]
e Region
r = Region -> [Tree (Tok Token)] -> Tree (Tok Token)
findLargestWithin Region
r ([Tree (Tok Token)] -> Tree (Tok Token))
-> Maybe [Tree (Tok Token)] -> Maybe (Tree (Tok Token))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Tree (Tok Token)] -> Point -> Maybe [Tree (Tok Token)]
forall (tree :: * -> *) t.
IsTree tree =>
[tree (Tok t)] -> Point -> Maybe [tree (Tok t)]
getLastPath [Tree (Tok Token)]
e (Region -> Point
regionLast Region
r)
findLargestWithin :: Region -> [Tree TT] -> Tree TT
findLargestWithin :: Region -> [Tree (Tok Token)] -> Tree (Tok Token)
findLargestWithin Region
r = Tree (Tok Token) -> Maybe (Tree (Tok Token)) -> Tree (Tok Token)
forall a. a -> Maybe a -> a
fromMaybe (Tree (Tok Token) -> Maybe (Tree (Tok Token)) -> Tree (Tok Token))
-> ([Tree (Tok Token)] -> Tree (Tok Token))
-> [Tree (Tok Token)]
-> Maybe (Tree (Tok Token))
-> Tree (Tok Token)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tree (Tok Token)] -> Tree (Tok Token)
forall a. [a] -> a
head ([Tree (Tok Token)]
-> Maybe (Tree (Tok Token)) -> Tree (Tok Token))
-> ([Tree (Tok Token)] -> Maybe (Tree (Tok Token)))
-> [Tree (Tok Token)]
-> Tree (Tok Token)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Tree (Tok Token)] -> Maybe (Tree (Tok Token))
forall a. [a] -> Maybe a
safeLast ([Tree (Tok Token)] -> Maybe (Tree (Tok Token)))
-> ([Tree (Tok Token)] -> [Tree (Tok Token)])
-> [Tree (Tok Token)]
-> Maybe (Tree (Tok Token))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tree (Tok Token) -> Bool)
-> [Tree (Tok Token)] -> [Tree (Tok Token)]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Region -> Tree (Tok Token) -> Bool
within Region
r)
within :: Region -> Tree TT -> Bool
within :: Region -> Tree (Tok Token) -> Bool
within Region
r Tree (Tok Token)
t = Region -> Region -> Bool
includedRegion ((Point -> Point -> Region
mkRegion (Point -> Point -> Region)
-> (Tree (Tok Token) -> Point)
-> Tree (Tok Token)
-> Point
-> Region
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tree (Tok Token) -> Point
forall (t :: * -> *) t1. Foldable t => t (Tok t1) -> Point
getFirstOffset (Tree (Tok Token) -> Point -> Region)
-> (Tree (Tok Token) -> Point) -> Tree (Tok Token) -> Region
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tree (Tok Token) -> Point
forall (t :: * -> *) t1. Foldable t => t (Tok t1) -> Point
getLastOffset) Tree (Tok Token)
t) Region
r
safeLast :: [a] -> Maybe a
safeLast :: forall a. [a] -> Maybe a
safeLast [] = Maybe a
forall a. Maybe a
Nothing
safeLast [a]
s = a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ [a] -> a
forall a. [a] -> a
last [a]
s
dollarifyP :: H.Tree TT -> BufferM ()
dollarifyP :: Exp (Tok Token) -> BufferM ()
dollarifyP Exp (Tok Token)
e = BufferM ()
-> (Exp (Tok Token) -> BufferM ())
-> Maybe (Exp (Tok Token))
-> BufferM ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> BufferM ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()) Exp (Tok Token) -> BufferM ()
dollarifyWithinP (Maybe (Exp (Tok Token)) -> BufferM ())
-> (Region -> Maybe (Exp (Tok Token))) -> Region -> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Exp (Tok Token)] -> Region -> Maybe (Exp (Tok Token))
selectedTreeP [Exp (Tok Token)
e] (Region -> BufferM ()) -> BufferM Region -> BufferM ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< BufferM Region
getSelectRegionB
dollarifyWithinP :: H.Exp TT -> BufferM ()
dollarifyWithinP :: Exp (Tok Token) -> BufferM ()
dollarifyWithinP = Text -> BufferM () -> BufferM ()
forall a. Text -> a -> a
trace (Text -> BufferM () -> BufferM ())
-> (Exp (Tok Token) -> Text)
-> Exp (Tok Token)
-> BufferM ()
-> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text
"dollarifyWithin: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (Text -> Text)
-> (Exp (Tok Token) -> Text) -> Exp (Tok Token) -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (Tok Token) -> Text
forall a. Show a => a -> Text
showT (Exp (Tok Token) -> BufferM () -> BufferM ())
-> (Exp (Tok Token) -> BufferM ()) -> Exp (Tok Token) -> BufferM ()
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [QueuedUpdate] -> BufferM ()
runQ ([QueuedUpdate] -> BufferM ())
-> (Exp (Tok Token) -> [QueuedUpdate])
-> Exp (Tok Token)
-> BufferM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Tok Token) -> [QueuedUpdate]
dollarifyTopP (Exp (Tok Token) -> [QueuedUpdate])
-> [Exp (Tok Token)] -> [QueuedUpdate]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) ([Exp (Tok Token)] -> [QueuedUpdate])
-> (Exp (Tok Token) -> [Exp (Tok Token)])
-> Exp (Tok Token)
-> [QueuedUpdate]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (Tok Token) -> [Exp (Tok Token)]
forall (tree :: * -> *) t. IsTree tree => tree t -> [tree t]
getAllSubTrees
isNormalParenP :: H.Exp TT -> Bool
isNormalParenP :: Exp (Tok Token) -> Bool
isNormalParenP (H.Paren (H.PAtom Tok Token
r [Tok Token]
_) [Exp (Tok Token)]
xs (H.PAtom Tok Token
r' [Tok Token]
_)) =
Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
r Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
openParen Bool -> Bool -> Bool
&& Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
r' Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Token
closeParen Bool -> Bool -> Bool
&& Bool -> Bool
not ((Exp (Tok Token) -> Bool) -> [Exp (Tok Token)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Exp (Tok Token) -> Bool
isTupleP [Exp (Tok Token)]
xs)
isNormalParenP Exp (Tok Token)
_ = Bool
False
isTupleP :: H.Exp TT -> Bool
isTupleP :: Exp (Tok Token) -> Bool
isTupleP (H.PAtom Tok Token
t [Tok Token]
_) = Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
t Token -> Token -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Token
Special Char
','
isTupleP Exp (Tok Token)
_ = Bool
False
stripCommentsP :: [H.Exp TT] -> [H.Exp TT]
= (Exp (Tok Token) -> Bool) -> [Exp (Tok Token)] -> [Exp (Tok Token)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Exp (Tok Token) -> Bool)
-> [Exp (Tok Token)] -> [Exp (Tok Token)])
-> (Exp (Tok Token) -> Bool)
-> [Exp (Tok Token)]
-> [Exp (Tok Token)]
forall a b. (a -> b) -> a -> b
$ \Exp (Tok Token)
t -> case Exp (Tok Token)
t of { (H.PAtom Tok Token
x [Tok Token]
_) -> Bool -> Bool
not (Token -> Bool
isComment (Token -> Bool) -> Token -> Bool
forall a b. (a -> b) -> a -> b
$ Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
x); Exp (Tok Token)
_ -> Bool
True }
dollarifyTopP :: H.Exp TT -> [QueuedUpdate]
dollarifyTopP :: Exp (Tok Token) -> [QueuedUpdate]
dollarifyTopP p :: Exp (Tok Token)
p@(H.Paren (H.PAtom Tok Token
t1 [Tok Token]
_) [Exp (Tok Token)]
e (H.PAtom Tok Token
t2 [Tok Token]
_))
| Exp (Tok Token) -> Bool
isNormalParenP Exp (Tok Token)
p = case [Exp (Tok Token)] -> [Exp (Tok Token)]
stripCommentsP [Exp (Tok Token)]
e of
[H.Paren{}] -> [Tok Token -> QueuedUpdate
queueDelete Tok Token
t2, Tok Token -> QueuedUpdate
queueDelete Tok Token
t1]
[Exp (Tok Token)]
e' -> [Exp (Tok Token)] -> [QueuedUpdate]
dollarifyExprP [Exp (Tok Token)]
e'
dollarifyTopP (H.Block [Exp (Tok Token)]
bList) = [Exp (Tok Token)] -> [QueuedUpdate]
dollarifyExprP ([Exp (Tok Token)] -> [QueuedUpdate])
-> ([Exp (Tok Token)] -> [Exp (Tok Token)])
-> [Exp (Tok Token)]
-> [QueuedUpdate]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Exp (Tok Token)] -> [Exp (Tok Token)]
stripCommentsP ([Exp (Tok Token)] -> [QueuedUpdate])
-> [Exp (Tok Token)] -> [QueuedUpdate]
forall a b. (a -> b) -> a -> b
$ [Exp (Tok Token)]
bList
dollarifyTopP Exp (Tok Token)
_ = []
dollarifyExprP :: [H.Exp TT] -> [QueuedUpdate]
dollarifyExprP :: [Exp (Tok Token)] -> [QueuedUpdate]
dollarifyExprP e :: [Exp (Tok Token)]
e@(Exp (Tok Token)
_:[Exp (Tok Token)]
_)
| p :: Exp (Tok Token)
p@(H.Paren (H.PAtom Tok Token
t [Tok Token]
_) [Exp (Tok Token)]
e2 (H.PAtom Tok Token
t2 [Tok Token]
_)) <- [Exp (Tok Token)] -> Exp (Tok Token)
forall a. [a] -> a
last [Exp (Tok Token)]
e
, Exp (Tok Token) -> Bool
isNormalParenP Exp (Tok Token)
p
, (Exp (Tok Token) -> Bool) -> [Exp (Tok Token)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Exp (Tok Token) -> Bool
isSimpleP [Exp (Tok Token)]
e
= let dollarifyLoop :: [H.Exp TT] -> [QueuedUpdate]
dollarifyLoop :: [Exp (Tok Token)] -> [QueuedUpdate]
dollarifyLoop [] = []
dollarifyLoop e3 :: [Exp (Tok Token)]
e3@[H.Paren{}] = [Exp (Tok Token)] -> [QueuedUpdate]
dollarifyExprP [Exp (Tok Token)]
e3
dollarifyLoop [Exp (Tok Token)]
e3 = if [Exp (Tok Token)] -> Bool
isCollapsibleP [Exp (Tok Token)]
e3 then [Tok Token -> QueuedUpdate
queueDelete Tok Token
t2, YiString -> Tok Token -> QueuedUpdate
queueReplaceWith YiString
"$ " Tok Token
t] else []
in [Exp (Tok Token)] -> [QueuedUpdate]
dollarifyLoop ([Exp (Tok Token)] -> [QueuedUpdate])
-> [Exp (Tok Token)] -> [QueuedUpdate]
forall a b. (a -> b) -> a -> b
$ [Exp (Tok Token)] -> [Exp (Tok Token)]
stripCommentsP [Exp (Tok Token)]
e2
dollarifyExprP [Exp (Tok Token)]
_ = []
isSimpleP :: H.Exp TT -> Bool
isSimpleP :: Exp (Tok Token) -> Bool
isSimpleP (H.Paren{}) = Bool
True
isSimpleP (H.Block{}) = Bool
False
isSimpleP (H.PAtom Tok Token
t [Tok Token]
_) = Tok Token -> Token
forall t. Tok t -> t
tokT Tok Token
t Token -> [Token] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Token
Number, Token
CharTok, Token
StringTok, Token
VarIdent, Token
ConsIdent]
isSimpleP Exp (Tok Token)
_ = Bool
False
isCollapsibleP :: [H.Exp TT] -> Bool
isCollapsibleP :: [Exp (Tok Token)] -> Bool
isCollapsibleP = (Bool -> Bool -> Bool
(&&) (Bool -> Bool -> Bool)
-> (Exp (Tok Token) -> Bool)
-> Exp (Tok Token)
-> Exp (Tok Token)
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Exp (Tok Token) -> Bool
isSimpleP) (Exp (Tok Token) -> Exp (Tok Token) -> Bool)
-> ([Exp (Tok Token)] -> Exp (Tok Token))
-> [Exp (Tok Token)]
-> Exp (Tok Token)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Exp (Tok Token)] -> Exp (Tok Token)
forall a. [a] -> a
head ([Exp (Tok Token)] -> Exp (Tok Token) -> Bool)
-> ([Exp (Tok Token)] -> Exp (Tok Token))
-> [Exp (Tok Token)]
-> Bool
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Exp (Tok Token)] -> Exp (Tok Token)
forall a. [a] -> a
last
selectedTreeP :: [H.Exp TT] -> Region -> Maybe (H.Exp TT)
selectedTreeP :: [Exp (Tok Token)] -> Region -> Maybe (Exp (Tok Token))
selectedTreeP [Exp (Tok Token)]
e Region
r = Region -> [Exp (Tok Token)] -> Exp (Tok Token)
findLargestWithinP Region
r ([Exp (Tok Token)] -> Exp (Tok Token))
-> Maybe [Exp (Tok Token)] -> Maybe (Exp (Tok Token))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Exp (Tok Token)] -> Point -> Maybe [Exp (Tok Token)]
forall (tree :: * -> *) t.
IsTree tree =>
[tree (Tok t)] -> Point -> Maybe [tree (Tok t)]
getLastPath [Exp (Tok Token)]
e (Region -> Point
regionLast Region
r)
findLargestWithinP :: Region -> [H.Exp TT] -> H.Exp TT
findLargestWithinP :: Region -> [Exp (Tok Token)] -> Exp (Tok Token)
findLargestWithinP Region
r = Exp (Tok Token) -> Maybe (Exp (Tok Token)) -> Exp (Tok Token)
forall a. a -> Maybe a -> a
fromMaybe (Exp (Tok Token) -> Maybe (Exp (Tok Token)) -> Exp (Tok Token))
-> ([Exp (Tok Token)] -> Exp (Tok Token))
-> [Exp (Tok Token)]
-> Maybe (Exp (Tok Token))
-> Exp (Tok Token)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Exp (Tok Token)] -> Exp (Tok Token)
forall a. [a] -> a
head ([Exp (Tok Token)] -> Maybe (Exp (Tok Token)) -> Exp (Tok Token))
-> ([Exp (Tok Token)] -> Maybe (Exp (Tok Token)))
-> [Exp (Tok Token)]
-> Exp (Tok Token)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Exp (Tok Token)] -> Maybe (Exp (Tok Token))
forall a. [a] -> Maybe a
safeLast ([Exp (Tok Token)] -> Maybe (Exp (Tok Token)))
-> ([Exp (Tok Token)] -> [Exp (Tok Token)])
-> [Exp (Tok Token)]
-> Maybe (Exp (Tok Token))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Tok Token) -> Bool) -> [Exp (Tok Token)] -> [Exp (Tok Token)]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Region -> Exp (Tok Token) -> Bool
withinP Region
r)
withinP :: Region -> H.Exp TT -> Bool
withinP :: Region -> Exp (Tok Token) -> Bool
withinP Region
r Exp (Tok Token)
t = Region -> Region -> Bool
includedRegion ((Point -> Point -> Region
mkRegion (Point -> Point -> Region)
-> (Exp (Tok Token) -> Point) -> Exp (Tok Token) -> Point -> Region
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (Tok Token) -> Point
forall (t :: * -> *) t1. Foldable t => t (Tok t1) -> Point
getFirstOffset (Exp (Tok Token) -> Point -> Region)
-> (Exp (Tok Token) -> Point) -> Exp (Tok Token) -> Region
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Exp (Tok Token) -> Point
forall (t :: * -> *) t1. Foldable t => t (Tok t1) -> Point
getLastOffset) Exp (Tok Token)
t) Region
r
safeLastP :: [a] -> Maybe a
safeLastP :: forall a. [a] -> Maybe a
safeLastP [] = Maybe a
forall a. Maybe a
Nothing
safeLastP [a]
s = a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ [a] -> a
forall a. [a] -> a
last [a]
s