From eee98d4ae8d367bbe3c82d5a793384aae2f5c5e5 Mon Sep 17 00:00:00 2001 From: Edsko de Vries Date: Sat, 28 Feb 2015 23:18:17 +0000 Subject: [PATCH] Combinator for defining a grammar by enumeration --- src/Language/JsonGrammar/Grammar.hs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Language/JsonGrammar/Grammar.hs b/src/Language/JsonGrammar/Grammar.hs index 0127d64..c1fe788 100644 --- a/src/Language/JsonGrammar/Grammar.hs +++ b/src/Language/JsonGrammar/Grammar.hs @@ -24,7 +24,7 @@ import Data.StackPrism (StackPrism, forward, backward, (:-)(..)) import Data.String (IsString(..)) import Data.Text (Text) import Language.TypeScript (Type(..), PredefinedType(..)) - +import qualified Data.Aeson as Aeson -- Types @@ -201,3 +201,14 @@ defaultValue x = Pure f g -- | Create a 'pure' grammar from a 'StackPrism'. fromPrism :: StackPrism a b -> Grammar c a b fromPrism p = Pure (return . forward p) (backward p) + +-- | Define a grammar by enumerating the possible values +-- +-- For example: +-- +-- > bool :: Grammar Val (Value :- t) (Bool :- t) +-- > bool = enumeration [(True, "true"), (False, "false")] +enumeration :: Eq a => [(a, Text)] -> Grammar Val (Value :- t) (a :- t) +enumeration = mconcat . map aux + where + aux (a, txt) = defaultValue a . literal (Aeson.String txt)