{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Swarm.Language.Parser (
readTerm,
readNonemptyTerm,
readTerm',
) where
import Control.Monad ((>=>))
import Data.Bifunctor (first, second)
import Data.Either.Extra (maybeToEither)
import Data.Sequence (Seq)
import Data.Text (Text)
import Swarm.Language.Parser.Comment (populateComments)
import Swarm.Language.Parser.Core (ParserConfig, ParserError, defaultParserConfig, runParser')
import Swarm.Language.Parser.Lex (sc)
import Swarm.Language.Parser.Term (parseTerm)
import Swarm.Language.Parser.Util (fullyMaybe)
import Swarm.Language.Syntax (Comment, Syntax)
import Text.Megaparsec.Error (errorBundlePretty)
import Witch (from)
readNonemptyTerm :: Text -> Either Text Syntax
readNonemptyTerm :: Text -> Either Text Syntax
readNonemptyTerm = Text -> Either Text (Maybe Syntax)
readTerm (Text -> Either Text (Maybe Syntax))
-> (Maybe Syntax -> Either Text Syntax)
-> Text
-> Either Text Syntax
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Text -> Maybe Syntax -> Either Text Syntax
forall a b. a -> Maybe b -> Either a b
maybeToEither Text
"Empty term"
readTerm :: Text -> Either Text (Maybe Syntax)
readTerm :: Text -> Either Text (Maybe Syntax)
readTerm = (ParseErrorBundle Text Void -> Text)
-> Either (ParseErrorBundle Text Void) (Maybe Syntax)
-> Either Text (Maybe Syntax)
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (String -> Text
forall source target. From source target => source -> target
from (String -> Text)
-> (ParseErrorBundle Text Void -> String)
-> ParseErrorBundle Text Void
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseErrorBundle Text Void -> String
forall s e.
(VisualStream s, TraversableStream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty) (Either (ParseErrorBundle Text Void) (Maybe Syntax)
-> Either Text (Maybe Syntax))
-> (Text -> Either (ParseErrorBundle Text Void) (Maybe Syntax))
-> Text
-> Either Text (Maybe Syntax)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserConfig
-> Text -> Either (ParseErrorBundle Text Void) (Maybe Syntax)
readTerm' ParserConfig
defaultParserConfig
readTerm' :: ParserConfig -> Text -> Either ParserError (Maybe Syntax)
readTerm' :: ParserConfig
-> Text -> Either (ParseErrorBundle Text Void) (Maybe Syntax)
readTerm' ParserConfig
cfg = ((Maybe Syntax, Seq Comment) -> Maybe Syntax)
-> Either (ParseErrorBundle Text Void) (Maybe Syntax, Seq Comment)
-> Either (ParseErrorBundle Text Void) (Maybe Syntax)
forall b c a. (b -> c) -> Either a b -> Either a c
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (Maybe Syntax, Seq Comment) -> Maybe Syntax
handleComments (Either (ParseErrorBundle Text Void) (Maybe Syntax, Seq Comment)
-> Either (ParseErrorBundle Text Void) (Maybe Syntax))
-> (Text
-> Either (ParseErrorBundle Text Void) (Maybe Syntax, Seq Comment))
-> Text
-> Either (ParseErrorBundle Text Void) (Maybe Syntax)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParserConfig
-> Parser (Maybe Syntax)
-> Text
-> Either (ParseErrorBundle Text Void) (Maybe Syntax, Seq Comment)
forall a.
ParserConfig
-> Parser a
-> Text
-> Either (ParseErrorBundle Text Void) (a, Seq Comment)
runParser' ParserConfig
cfg (ReaderT ParserConfig (StateT WSState (Parsec Void Text)) ()
-> ReaderT ParserConfig (StateT WSState (Parsec Void Text)) Syntax
-> Parser (Maybe Syntax)
forall e s (f :: * -> *) a.
MonadParsec e s f =>
f () -> f a -> f (Maybe a)
fullyMaybe ReaderT ParserConfig (StateT WSState (Parsec Void Text)) ()
sc ReaderT ParserConfig (StateT WSState (Parsec Void Text)) Syntax
parseTerm)
where
handleComments :: (Maybe Syntax, Seq Comment) -> Maybe Syntax
handleComments :: (Maybe Syntax, Seq Comment) -> Maybe Syntax
handleComments (Maybe Syntax
s, Seq Comment
cs) = Seq Comment -> Syntax -> Syntax
populateComments Seq Comment
cs (Syntax -> Syntax) -> Maybe Syntax -> Maybe Syntax
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Syntax
s