module Ribosome.Data.Syntax where

import qualified Data.Map.Strict as Map (fromList)

data SyntaxItemDetail =
  Keyword {
    SyntaxItemDetail -> Text
kwGroup :: Text,
    SyntaxItemDetail -> Text
kwKeyword :: Text,
    SyntaxItemDetail -> [Text]
kwOptions :: [Text]
  }
  |
  Match {
    SyntaxItemDetail -> Text
matchGroup :: Text,
    SyntaxItemDetail -> Text
matchPattern :: Text
  }
  |
  Region {
    SyntaxItemDetail -> Text
regionGroup :: Text,
    SyntaxItemDetail -> Text
regionStart :: Text,
    SyntaxItemDetail -> Text
regionEnd :: Text,
    SyntaxItemDetail -> Maybe Text
regionSkip :: Maybe Text,
    SyntaxItemDetail -> Text
regionStartOffset :: Text,
    SyntaxItemDetail -> Text
regionEndOffset :: Text
  }
  |
  Verbatim {
    SyntaxItemDetail -> Text
verbatimCommand :: Text
  }
  deriving (SyntaxItemDetail -> SyntaxItemDetail -> Bool
(SyntaxItemDetail -> SyntaxItemDetail -> Bool)
-> (SyntaxItemDetail -> SyntaxItemDetail -> Bool)
-> Eq SyntaxItemDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SyntaxItemDetail -> SyntaxItemDetail -> Bool
$c/= :: SyntaxItemDetail -> SyntaxItemDetail -> Bool
== :: SyntaxItemDetail -> SyntaxItemDetail -> Bool
$c== :: SyntaxItemDetail -> SyntaxItemDetail -> Bool
Eq, Int -> SyntaxItemDetail -> ShowS
[SyntaxItemDetail] -> ShowS
SyntaxItemDetail -> String
(Int -> SyntaxItemDetail -> ShowS)
-> (SyntaxItemDetail -> String)
-> ([SyntaxItemDetail] -> ShowS)
-> Show SyntaxItemDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SyntaxItemDetail] -> ShowS
$cshowList :: [SyntaxItemDetail] -> ShowS
show :: SyntaxItemDetail -> String
$cshow :: SyntaxItemDetail -> String
showsPrec :: Int -> SyntaxItemDetail -> ShowS
$cshowsPrec :: Int -> SyntaxItemDetail -> ShowS
Show)

data SyntaxItem =
  SyntaxItem {
    SyntaxItem -> SyntaxItemDetail
siDetail :: SyntaxItemDetail,
    SyntaxItem -> [Text]
siOptions :: [Text],
    SyntaxItem -> Map Text Text
siParams :: Map Text Text
  }
  deriving (SyntaxItem -> SyntaxItem -> Bool
(SyntaxItem -> SyntaxItem -> Bool)
-> (SyntaxItem -> SyntaxItem -> Bool) -> Eq SyntaxItem
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SyntaxItem -> SyntaxItem -> Bool
$c/= :: SyntaxItem -> SyntaxItem -> Bool
== :: SyntaxItem -> SyntaxItem -> Bool
$c== :: SyntaxItem -> SyntaxItem -> Bool
Eq, Int -> SyntaxItem -> ShowS
[SyntaxItem] -> ShowS
SyntaxItem -> String
(Int -> SyntaxItem -> ShowS)
-> (SyntaxItem -> String)
-> ([SyntaxItem] -> ShowS)
-> Show SyntaxItem
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SyntaxItem] -> ShowS
$cshowList :: [SyntaxItem] -> ShowS
show :: SyntaxItem -> String
$cshow :: SyntaxItem -> String
showsPrec :: Int -> SyntaxItem -> ShowS
$cshowsPrec :: Int -> SyntaxItem -> ShowS
Show)

syntaxItem :: SyntaxItemDetail -> SyntaxItem
syntaxItem :: SyntaxItemDetail -> SyntaxItem
syntaxItem SyntaxItemDetail
detail =
  SyntaxItemDetail -> [Text] -> Map Text Text -> SyntaxItem
SyntaxItem SyntaxItemDetail
detail [Text]
forall a. Default a => a
def Map Text Text
forall a. Default a => a
def

syntaxKeyword :: Text -> Text -> SyntaxItem
syntaxKeyword :: Text -> Text -> SyntaxItem
syntaxKeyword Text
group' Text
keyword =
  SyntaxItemDetail -> SyntaxItem
syntaxItem (SyntaxItemDetail -> SyntaxItem) -> SyntaxItemDetail -> SyntaxItem
forall a b. (a -> b) -> a -> b
$ Text -> Text -> [Text] -> SyntaxItemDetail
Keyword Text
group' Text
keyword [Text]
forall a. Default a => a
def

syntaxMatch :: Text -> Text -> SyntaxItem
syntaxMatch :: Text -> Text -> SyntaxItem
syntaxMatch Text
group' Text
pat =
  SyntaxItemDetail -> SyntaxItem
syntaxItem (SyntaxItemDetail -> SyntaxItem) -> SyntaxItemDetail -> SyntaxItem
forall a b. (a -> b) -> a -> b
$ Text -> Text -> SyntaxItemDetail
Match Text
group' Text
pat

syntaxRegionOffset :: Text -> Text -> Text -> Maybe Text -> Text -> Text -> SyntaxItem
syntaxRegionOffset :: Text -> Text -> Text -> Maybe Text -> Text -> Text -> SyntaxItem
syntaxRegionOffset Text
group' Text
start Text
end Maybe Text
skip Text
ms Text
me =
  SyntaxItemDetail -> SyntaxItem
syntaxItem (SyntaxItemDetail -> SyntaxItem) -> SyntaxItemDetail -> SyntaxItem
forall a b. (a -> b) -> a -> b
$ Text
-> Text -> Text -> Maybe Text -> Text -> Text -> SyntaxItemDetail
Region Text
group' Text
start Text
end Maybe Text
skip Text
ms Text
me

syntaxRegion :: Text -> Text -> Text -> Maybe Text -> SyntaxItem
syntaxRegion :: Text -> Text -> Text -> Maybe Text -> SyntaxItem
syntaxRegion Text
group' Text
start Text
end Maybe Text
skip =
  Text -> Text -> Text -> Maybe Text -> Text -> Text -> SyntaxItem
syntaxRegionOffset Text
group' Text
start Text
end Maybe Text
skip Text
"" Text
""

syntaxVerbatim :: Text -> SyntaxItem
syntaxVerbatim :: Text -> SyntaxItem
syntaxVerbatim =
  SyntaxItemDetail -> SyntaxItem
syntaxItem (SyntaxItemDetail -> SyntaxItem)
-> (Text -> SyntaxItemDetail) -> Text -> SyntaxItem
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> SyntaxItemDetail
Verbatim

data Highlight =
  Highlight {
    Highlight -> Text
hiGroup :: Text,
    Highlight -> Map Text Text
hiValues :: Map Text Text
  }
  deriving (Highlight -> Highlight -> Bool
(Highlight -> Highlight -> Bool)
-> (Highlight -> Highlight -> Bool) -> Eq Highlight
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Highlight -> Highlight -> Bool
$c/= :: Highlight -> Highlight -> Bool
== :: Highlight -> Highlight -> Bool
$c== :: Highlight -> Highlight -> Bool
Eq, Int -> Highlight -> ShowS
[Highlight] -> ShowS
Highlight -> String
(Int -> Highlight -> ShowS)
-> (Highlight -> String)
-> ([Highlight] -> ShowS)
-> Show Highlight
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Highlight] -> ShowS
$cshowList :: [Highlight] -> ShowS
show :: Highlight -> String
$cshow :: Highlight -> String
showsPrec :: Int -> Highlight -> ShowS
$cshowsPrec :: Int -> Highlight -> ShowS
Show)

syntaxHighlight :: Text -> [(Text, Text)] -> Highlight
syntaxHighlight :: Text -> [(Text, Text)] -> Highlight
syntaxHighlight Text
group' =
  Text -> Map Text Text -> Highlight
Highlight Text
group' (Map Text Text -> Highlight)
-> ([(Text, Text)] -> Map Text Text) -> [(Text, Text)] -> Highlight
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Text, Text)] -> Map Text Text
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList

data HiLink =
  HiLink {
    HiLink -> Text
hlGroup :: Text,
    HiLink -> Text
hlTarget :: Text
  }
  deriving (HiLink -> HiLink -> Bool
(HiLink -> HiLink -> Bool)
-> (HiLink -> HiLink -> Bool) -> Eq HiLink
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HiLink -> HiLink -> Bool
$c/= :: HiLink -> HiLink -> Bool
== :: HiLink -> HiLink -> Bool
$c== :: HiLink -> HiLink -> Bool
Eq, Int -> HiLink -> ShowS
[HiLink] -> ShowS
HiLink -> String
(Int -> HiLink -> ShowS)
-> (HiLink -> String) -> ([HiLink] -> ShowS) -> Show HiLink
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HiLink] -> ShowS
$cshowList :: [HiLink] -> ShowS
show :: HiLink -> String
$cshow :: HiLink -> String
showsPrec :: Int -> HiLink -> ShowS
$cshowsPrec :: Int -> HiLink -> ShowS
Show)

data Syntax =
  Syntax {
     Syntax -> [SyntaxItem]
syntaxItems :: [SyntaxItem],
     Syntax -> [Highlight]
syntaxHighlights :: [Highlight],
     Syntax -> [HiLink]
syntaxHiLinks :: [HiLink]
  }
  deriving (Syntax -> Syntax -> Bool
(Syntax -> Syntax -> Bool)
-> (Syntax -> Syntax -> Bool) -> Eq Syntax
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Syntax -> Syntax -> Bool
$c/= :: Syntax -> Syntax -> Bool
== :: Syntax -> Syntax -> Bool
$c== :: Syntax -> Syntax -> Bool
Eq, Int -> Syntax -> ShowS
[Syntax] -> ShowS
Syntax -> String
(Int -> Syntax -> ShowS)
-> (Syntax -> String) -> ([Syntax] -> ShowS) -> Show Syntax
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Syntax] -> ShowS
$cshowList :: [Syntax] -> ShowS
show :: Syntax -> String
$cshow :: Syntax -> String
showsPrec :: Int -> Syntax -> ShowS
$cshowsPrec :: Int -> Syntax -> ShowS
Show, (forall x. Syntax -> Rep Syntax x)
-> (forall x. Rep Syntax x -> Syntax) -> Generic Syntax
forall x. Rep Syntax x -> Syntax
forall x. Syntax -> Rep Syntax x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Syntax x -> Syntax
$cfrom :: forall x. Syntax -> Rep Syntax x
Generic, Syntax
Syntax -> Default Syntax
forall a. a -> Default a
def :: Syntax
$cdef :: Syntax
Default)