module Snail.Ast (
Bracket (..),
SnailAst (..),
unwrap,
) where
import Data.Text (Text)
import Text.Megaparsec
data Bracket
= Round
| Square
| Curly
deriving (Int -> Bracket -> ShowS
[Bracket] -> ShowS
Bracket -> String
(Int -> Bracket -> ShowS)
-> (Bracket -> String) -> ([Bracket] -> ShowS) -> Show Bracket
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Bracket -> ShowS
showsPrec :: Int -> Bracket -> ShowS
$cshow :: Bracket -> String
show :: Bracket -> String
$cshowList :: [Bracket] -> ShowS
showList :: [Bracket] -> ShowS
Show, Bracket -> Bracket -> Bool
(Bracket -> Bracket -> Bool)
-> (Bracket -> Bracket -> Bool) -> Eq Bracket
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Bracket -> Bracket -> Bool
== :: Bracket -> Bracket -> Bool
$c/= :: Bracket -> Bracket -> Bool
/= :: Bracket -> Bracket -> Bool
Eq)
data SnailAst
= Lexeme (SourcePos, Text)
| TextLiteral (SourcePos, Text)
| SExpression (Maybe Char) Bracket [SnailAst]
deriving (SnailAst -> SnailAst -> Bool
(SnailAst -> SnailAst -> Bool)
-> (SnailAst -> SnailAst -> Bool) -> Eq SnailAst
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SnailAst -> SnailAst -> Bool
== :: SnailAst -> SnailAst -> Bool
$c/= :: SnailAst -> SnailAst -> Bool
/= :: SnailAst -> SnailAst -> Bool
Eq, Int -> SnailAst -> ShowS
[SnailAst] -> ShowS
SnailAst -> String
(Int -> SnailAst -> ShowS)
-> (SnailAst -> String) -> ([SnailAst] -> ShowS) -> Show SnailAst
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SnailAst -> ShowS
showsPrec :: Int -> SnailAst -> ShowS
$cshow :: SnailAst -> String
show :: SnailAst -> String
$cshowList :: [SnailAst] -> ShowS
showList :: [SnailAst] -> ShowS
Show)
unwrap :: SnailAst -> SnailAst
unwrap :: SnailAst -> SnailAst
unwrap = \case
SExpression Maybe Char
_ Bracket
_ [SnailAst
x] -> SnailAst
x
SnailAst
x -> SnailAst
x