module Wrench.Translator.Parser.CodeSection ( codeSection, ) where import Relude import Text.Megaparsec (choice) import Text.Megaparsec.Char (hspace1, string) import Wrench.Translator.Parser.Misc import Wrench.Translator.Parser.Types import Wrench.Translator.Types codeSection :: (MnemonicParser isa) => String -> Parser (Section isa w Text) codeSection :: forall isa w. MnemonicParser isa => String -> Parser (Section isa w Text) codeSection String cstart = do Tokens String -> ParsecT Void String Identity (Tokens String) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens String ".text" ParsecT Void String Identity (Tokens String) -> ParsecT Void String Identity () -> ParsecT Void String Identity () forall a b. ParsecT Void String Identity a -> ParsecT Void String Identity b -> ParsecT Void String Identity b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> String -> ParsecT Void String Identity () eol' String cstart items <- [Maybe (SectionItem (CodeToken isa Text))] -> [SectionItem (CodeToken isa Text)] forall a. [Maybe a] -> [a] catMaybes ([Maybe (SectionItem (CodeToken isa Text))] -> [SectionItem (CodeToken isa Text)]) -> ParsecT Void String Identity [Maybe (SectionItem (CodeToken isa Text))] -> ParsecT Void String Identity [SectionItem (CodeToken isa Text)] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text))) -> ParsecT Void String Identity [Maybe (SectionItem (CodeToken isa Text))] forall a. ParsecT Void String Identity a -> ParsecT Void String Identity [a] forall (f :: * -> *) a. Alternative f => f a -> f [a] many ( [ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text)))] -> ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text))) forall (f :: * -> *) (m :: * -> *) a. (Foldable f, Alternative m) => f (m a) -> m a choice [ ParsecT Void String Identity () -> ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text))) forall (m :: * -> *) a b. Monad m => m a -> m (Maybe b) nothing (ParsecT Void String Identity () forall e s (m :: * -> *). (MonadParsec e s m, Token s ~ Char) => m () hspace1 ParsecT Void String Identity () -> ParsecT Void String Identity () -> ParsecT Void String Identity () forall a. ParsecT Void String Identity a -> ParsecT Void String Identity a -> ParsecT Void String Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> String -> ParsecT Void String Identity () eol' String cstart) , SectionItem (CodeToken isa Text) -> Maybe (SectionItem (CodeToken isa Text)) forall a. a -> Maybe a Just (SectionItem (CodeToken isa Text) -> Maybe (SectionItem (CodeToken isa Text))) -> (Int -> SectionItem (CodeToken isa Text)) -> Int -> Maybe (SectionItem (CodeToken isa Text)) forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> SectionItem (CodeToken isa Text) forall i. Int -> SectionItem i Org (Int -> Maybe (SectionItem (CodeToken isa Text))) -> ParsecT Void String Identity Int -> ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text))) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> String -> ParsecT Void String Identity Int orgDirective String cstart , SectionItem (CodeToken isa Text) -> Maybe (SectionItem (CodeToken isa Text)) forall a. a -> Maybe a Just (SectionItem (CodeToken isa Text) -> Maybe (SectionItem (CodeToken isa Text))) -> (Text -> SectionItem (CodeToken isa Text)) -> Text -> Maybe (SectionItem (CodeToken isa Text)) forall b c a. (b -> c) -> (a -> b) -> a -> c . CodeToken isa Text -> SectionItem (CodeToken isa Text) forall i. i -> SectionItem i Item (CodeToken isa Text -> SectionItem (CodeToken isa Text)) -> (Text -> CodeToken isa Text) -> Text -> SectionItem (CodeToken isa Text) forall b c a. (b -> c) -> (a -> b) -> a -> c . Text -> CodeToken isa Text forall isa l. l -> CodeToken isa l Label (Text -> Maybe (SectionItem (CodeToken isa Text))) -> ParsecT Void String Identity Text -> ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text))) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ParsecT Void String Identity Text label , SectionItem (CodeToken isa Text) -> Maybe (SectionItem (CodeToken isa Text)) forall a. a -> Maybe a Just (SectionItem (CodeToken isa Text) -> Maybe (SectionItem (CodeToken isa Text))) -> (isa -> SectionItem (CodeToken isa Text)) -> isa -> Maybe (SectionItem (CodeToken isa Text)) forall b c a. (b -> c) -> (a -> b) -> a -> c . CodeToken isa Text -> SectionItem (CodeToken isa Text) forall i. i -> SectionItem i Item (CodeToken isa Text -> SectionItem (CodeToken isa Text)) -> (isa -> CodeToken isa Text) -> isa -> SectionItem (CodeToken isa Text) forall b c a. (b -> c) -> (a -> b) -> a -> c . isa -> CodeToken isa Text forall isa l. isa -> CodeToken isa l Mnemonic (isa -> Maybe (SectionItem (CodeToken isa Text))) -> ParsecT Void String Identity isa -> ParsecT Void String Identity (Maybe (SectionItem (CodeToken isa Text))) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ParsecT Void String Identity isa forall m. MnemonicParser m => Parser m mnemonic ] ) return $ Code (sectionOrg items) $ sectionItems items