module Snail.ToText (toText) where

import Data.Text
import Snail.Ast

bracket :: Text -> Bracket -> Text
bracket :: Text -> Bracket -> Text
bracket Text
txt = \case
    Bracket
Round -> Text
"(" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
txt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
    Bracket
Square -> Text
"[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
txt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"]"
    Bracket
Curly -> Text
"{" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
txt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"}"

toText :: SnailAst -> Text
toText :: SnailAst -> Text
toText = \case
    TextLiteral (SourcePos
_, Text
txt) -> Text
"\"" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
txt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\""
    Lexeme (SourcePos
_, Text
lexeme) -> Text
lexeme
    SExpression Maybe Char
Nothing Bracket
bracketKind [SnailAst]
exprs ->
        let txt :: Text
txt = [Text] -> Text
Data.Text.unwords ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ SnailAst -> Text
toText (SnailAst -> Text) -> [SnailAst] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [SnailAst]
exprs
         in Text -> Bracket -> Text
bracket Text
txt Bracket
bracketKind
    SExpression (Just Char
c) Bracket
bracketKind [SnailAst]
exprs ->
        let txt :: Text
txt = [Text] -> Text
Data.Text.unwords ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ SnailAst -> Text
toText (SnailAst -> Text) -> [SnailAst] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [SnailAst]
exprs
         in Char -> Text
singleton Char
c Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Bracket -> Text
bracket Text
txt Bracket
bracketKind