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