-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | Parsing of Michelson types.

module Morley.Michelson.Parser.Type
  ( type_
  , field
  ) where

import Prelude hiding (note, some, try)

import Data.Default (Default)
import Fmt (pretty)
import Text.Megaparsec (choice, label)
import Text.Megaparsec.Char.Lexer qualified as L

import Morley.Michelson.Parser.Annotations
import Morley.Michelson.Parser.Lexer
import Morley.Michelson.Parser.Types (Parser)
import Morley.Michelson.Untyped

-- | This parses arbitrary type expressions.
--
-- Note that this includes parenthesized ones.
-- That is to say, @int@, @(int)@, @((int))@, etc will match with this parser and produce @TInt@.
type_ :: Parser Ty
type_ :: Parser Ty
type_ = (FieldAnn, Ty) -> Ty
forall a b. (a, b) -> b
snd ((FieldAnn, Ty) -> Ty)
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> Parser Ty
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
typeInner (FieldAnn -> Parser FieldAnn
forall a. a -> ParsecT CustomParserException Text Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldAnn
forall {k} (a :: k). Annotation a
noAnn)

field :: Parser (FieldAnn, Ty)
field :: ParsecT CustomParserException Text Identity (FieldAnn, Ty)
field = Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
typeInner Parser FieldAnn
forall tag. KnownAnnTag tag => Parser (Annotation tag)
note

typeInner
  :: Parser FieldAnn -> Parser (FieldAnn, Ty)
typeInner :: Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
typeInner Parser FieldAnn
fp = String
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a.
String
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity a
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label String
"type" (ParsecT CustomParserException Text Identity (FieldAnn, Ty)
 -> ParsecT CustomParserException Text Identity (FieldAnn, Ty))
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a b. (a -> b) -> a -> b
$ [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice ([ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
 -> ParsecT CustomParserException Text Identity (FieldAnn, Ty))
-> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a b. (a -> b) -> a -> b
$ (ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Parser a -> Parser a
parens ParsecT CustomParserException Text Identity (FieldAnn, Ty)
field ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
-> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
forall a. a -> [a] -> [a]
:) ([ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
 -> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)])
-> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
-> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
forall a b. (a -> b) -> a -> b
$ (\Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
x -> Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
x Parser FieldAnn
fp) ((Parser FieldAnn
  -> ParsecT CustomParserException Text Identity (FieldAnn, Ty))
 -> ParsecT CustomParserException Text Identity (FieldAnn, Ty))
-> [Parser FieldAnn
    -> ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
-> [ParsecT CustomParserException Text Identity (FieldAnn, Ty)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
  [ Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_int, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_nat, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_string, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_bytes, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_mutez, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_bool
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_keyhash, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_timestamp, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_address
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_key, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_unit, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_never, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_signature, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_chain_id
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_bls12381fr, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_bls12381g1, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_bls12381g2
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_option, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_list, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_set
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_operation, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_contract, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_ticket, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_pair, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_or
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_lambda, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_map, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_big_map
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_chestKey, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_chest
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_saplingState, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_saplingTransaction, Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Parser a -> Parser (a, Ty)
t_saplingTransactionDeprecated
  , Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
forall a. Default a => Parser a -> Parser (a, Ty)
t_txRollupL2Address
  ]

----------------------------------------------------------------------------
-- Non-comparable types
----------------------------------------------------------------------------

mkType :: T -> (a, TypeAnn) -> (a, Ty)
mkType :: forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
t (a
a, TypeAnn
ta) = (a
a, T -> TypeAnn -> Ty
Ty T
t TypeAnn
ta)


t_int :: (Default a) => Parser a -> Parser (a, Ty)
t_int :: forall a. Default a => Parser a -> Parser (a, Ty)
t_int Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"int" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TInt) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_nat :: (Default a) => Parser a -> Parser (a, Ty)
t_nat :: forall a. Default a => Parser a -> Parser (a, Ty)
t_nat Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"nat" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TNat) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_string :: (Default a) => Parser a -> Parser (a, Ty)
t_string :: forall a. Default a => Parser a -> Parser (a, Ty)
t_string Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"string" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TString) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_bytes :: (Default a) => Parser a -> Parser (a, Ty)
t_bytes :: forall a. Default a => Parser a -> Parser (a, Ty)
t_bytes Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"bytes" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TBytes) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_mutez :: (Default a) => Parser a -> Parser (a, Ty)
t_mutez :: forall a. Default a => Parser a -> Parser (a, Ty)
t_mutez Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"mutez" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TMutez) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_bool :: (Default a) => Parser a -> Parser (a, Ty)
t_bool :: forall a. Default a => Parser a -> Parser (a, Ty)
t_bool Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"bool" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TBool) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_keyhash :: (Default a) => Parser a -> Parser (a, Ty)
t_keyhash :: forall a. Default a => Parser a -> Parser (a, Ty)
t_keyhash Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"key_hash" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TKeyHash) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_timestamp :: (Default a) => Parser a -> Parser (a, Ty)
t_timestamp :: forall a. Default a => Parser a -> Parser (a, Ty)
t_timestamp Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"timestamp" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TTimestamp) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_address :: (Default a) => Parser a -> Parser (a, Ty)
t_address :: forall a. Default a => Parser a -> Parser (a, Ty)
t_address Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"address" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TAddress) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_key :: (Default a) => Parser a -> Parser (a, Ty)
t_key :: forall a. Default a => Parser a -> Parser (a, Ty)
t_key Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"key" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TKey) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_signature :: (Default a) => Parser a -> Parser (a, Ty)
t_signature :: forall a. Default a => Parser a -> Parser (a, Ty)
t_signature Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"signature" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TSignature) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_bls12381fr :: (Default a) => Parser a -> Parser (a, Ty)
t_bls12381fr :: forall a. Default a => Parser a -> Parser (a, Ty)
t_bls12381fr Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"bls12_381_fr"
  T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TBls12381Fr ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> Parser (a, Ty)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_bls12381g1 :: (Default a) => Parser a -> Parser (a, Ty)
t_bls12381g1 :: forall a. Default a => Parser a -> Parser (a, Ty)
t_bls12381g1 Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"bls12_381_g1"
  T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TBls12381G1 ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> Parser (a, Ty)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_bls12381g2 :: (Default a) => Parser a -> Parser (a, Ty)
t_bls12381g2 :: forall a. Default a => Parser a -> Parser (a, Ty)
t_bls12381g2 Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"bls12_381_g2"
  T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TBls12381G2 ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> Parser (a, Ty)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_chestKey :: (Default a) => Parser a -> Parser (a, Ty)
t_chestKey :: forall a. Default a => Parser a -> Parser (a, Ty)
t_chestKey Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"chest_key"
  T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TChestKey ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> Parser (a, Ty)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_chest :: (Default a) => Parser a -> Parser (a, Ty)
t_chest :: forall a. Default a => Parser a -> Parser (a, Ty)
t_chest Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"chest" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TChest) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_chain_id :: (Default a) => Parser a -> Parser (a, Ty)
t_chain_id :: forall a. Default a => Parser a -> Parser (a, Ty)
t_chain_id Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"chain_id"
  T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TChainId ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> Parser (a, Ty)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_operation :: (Default a) => Parser a -> Parser (a, Ty)
t_operation :: forall a. Default a => Parser a -> Parser (a, Ty)
t_operation Parser a
fp = Tokens Text
-> ((a, TypeAnn) -> (a, Ty)) -> Parser ((a, TypeAnn) -> (a, Ty))
forall a. Tokens Text -> a -> Parser a
word Text
Tokens Text
"operation" (T -> (a, TypeAnn) -> (a, Ty)
forall a. T -> (a, TypeAnn) -> (a, Ty)
mkType T
TOperation) Parser ((a, TypeAnn) -> (a, Ty))
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
-> ParsecT CustomParserException Text Identity (a, Ty)
forall a b.
ParsecT CustomParserException Text Identity (a -> b)
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
-> ParsecT CustomParserException Text Identity (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp

t_contract :: (Default a) => Parser a -> Parser (a, Ty)
t_contract :: forall a. Default a => Parser a -> Parser (a, Ty)
t_contract Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"contract"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- Parser Ty
type_
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> T
TContract Ty
a) TypeAnn
t)

t_ticket :: (Default a) => Parser a -> Parser (a, Ty)
t_ticket :: forall a. Default a => Parser a -> Parser (a, Ty)
t_ticket Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"ticket"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- Parser Ty
type_
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> T
TTicket Ty
a) TypeAnn
t)

-- | Parses a @unit@ type.
t_unit :: (Default a) => Parser a -> Parser (a, Ty)
t_unit :: forall a. Default a => Parser a -> Parser (a, Ty)
t_unit Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"unit"
  (a
f,TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  return (a
f, T -> TypeAnn -> Ty
Ty T
TUnit TypeAnn
t)

t_never :: (Default a) => Parser a -> Parser (a, Ty)
t_never :: forall a. Default a => Parser a -> Parser (a, Ty)
t_never Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"never" Parser () -> Parser () -> Parser ()
forall a.
ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"⊥"
  (a
f,TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  return (a
f, T -> TypeAnn -> Ty
Ty T
TNever TypeAnn
t)

t_pair :: (Default a) => Parser a -> Parser (a, Ty)
t_pair :: forall a. Default a => Parser a -> Parser (a, Ty)
t_pair Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"pair"
  (a
fieldAnn, TypeAnn
typeAnn) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  [(FieldAnn, Ty)]
fields <- ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> ParsecT CustomParserException Text Identity [(FieldAnn, Ty)]
forall a.
ParsecT CustomParserException Text Identity a
-> ParsecT CustomParserException Text Identity [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ParsecT CustomParserException Text Identity (FieldAnn, Ty)
field
  T
tPair <- [(FieldAnn, Ty)] -> Parser T
go [(FieldAnn, Ty)]
fields
  pure $ (a
fieldAnn, T -> TypeAnn -> Ty
Ty T
tPair TypeAnn
typeAnn)
  where
    go :: [(FieldAnn, Ty)] -> Parser T
    go :: [(FieldAnn, Ty)] -> Parser T
go = \case
      [] -> String -> Parser T
forall a. String -> ParsecT CustomParserException Text Identity a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"The 'pair' type expects at least 2 type arguments, but 0 were given."
      [(FieldAnn
_, Ty
t)] -> String -> Parser T
forall a. String -> ParsecT CustomParserException Text Identity a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser T) -> String -> Parser T
forall a b. (a -> b) -> a -> b
$ String
"The 'pair' type expects at least 2 type arguments, but only 1 was given: '" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Ty -> String
forall a b. (Buildable a, FromDoc b) => a -> b
pretty Ty
t String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"'."
      [(FieldAnn
fieldAnnL, Ty
typeL), (FieldAnn
fieldAnnR, Ty
typeR)] ->
        T -> Parser T
forall a. a -> ParsecT CustomParserException Text Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (T -> Parser T) -> T -> Parser T
forall a b. (a -> b) -> a -> b
$ FieldAnn -> FieldAnn -> VarAnn -> VarAnn -> Ty -> Ty -> T
TPair FieldAnn
fieldAnnL FieldAnn
fieldAnnR VarAnn
forall {k} (a :: k). Annotation a
noAnn VarAnn
forall {k} (a :: k). Annotation a
noAnn Ty
typeL Ty
typeR
      (FieldAnn
fieldAnnL, Ty
typeL) : [(FieldAnn, Ty)]
fields -> do
        T
rightCombedT <- [(FieldAnn, Ty)] -> Parser T
go [(FieldAnn, Ty)]
fields
        pure $ FieldAnn -> FieldAnn -> VarAnn -> VarAnn -> Ty -> Ty -> T
TPair FieldAnn
fieldAnnL FieldAnn
forall {k} (a :: k). Annotation a
noAnn VarAnn
forall {k} (a :: k). Annotation a
noAnn VarAnn
forall {k} (a :: k). Annotation a
noAnn Ty
typeL (T -> TypeAnn -> Ty
Ty T
rightCombedT TypeAnn
forall {k} (a :: k). Annotation a
noAnn)

t_or :: (Default a) => Parser a -> Parser (a, Ty)
t_or :: forall a. Default a => Parser a -> Parser (a, Ty)
t_or Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"or"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  (FieldAnn
l, Ty
a) <- ParsecT CustomParserException Text Identity (FieldAnn, Ty)
field
  (FieldAnn
r, Ty
b) <- ParsecT CustomParserException Text Identity (FieldAnn, Ty)
field
  return (a
f, T -> TypeAnn -> Ty
Ty (FieldAnn -> FieldAnn -> Ty -> Ty -> T
TOr FieldAnn
l FieldAnn
r Ty
a Ty
b) TypeAnn
t)

t_option :: (Default a) => Parser a -> Parser (a, Ty)
t_option :: forall a. Default a => Parser a -> Parser (a, Ty)
t_option Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"option"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- (FieldAnn, Ty) -> Ty
forall a b. (a, b) -> b
snd ((FieldAnn, Ty) -> Ty)
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
-> Parser Ty
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser FieldAnn
-> ParsecT CustomParserException Text Identity (FieldAnn, Ty)
typeInner (FieldAnn -> Parser FieldAnn
forall a. a -> ParsecT CustomParserException Text Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldAnn
forall {k} (a :: k). Annotation a
noAnn)
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> T
TOption Ty
a) TypeAnn
t)

t_saplingState :: (Default a) => Parser a -> Parser (a, Ty)
t_saplingState :: forall a. Default a => Parser a -> Parser (a, Ty)
t_saplingState Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"sapling_state"
  (a
f,TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Natural
n <- Parser Natural -> Parser Natural
forall a. Parser a -> Parser a
lexeme Parser Natural
forall e s (m :: * -> *) a.
(MonadParsec e s m, Token s ~ Char, Num a) =>
m a
L.decimal
  return (a
f, T -> TypeAnn -> Ty
Ty (Natural -> T
TSaplingState Natural
n) TypeAnn
t)

t_saplingTransaction :: (Default a) => Parser a -> Parser (a, Ty)
t_saplingTransaction :: forall a. Default a => Parser a -> Parser (a, Ty)
t_saplingTransaction Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"sapling_transaction"
  (a
f,TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Natural
n <- Parser Natural -> Parser Natural
forall a. Parser a -> Parser a
lexeme Parser Natural
forall e s (m :: * -> *) a.
(MonadParsec e s m, Token s ~ Char, Num a) =>
m a
L.decimal
  return (a
f, T -> TypeAnn -> Ty
Ty (Natural -> T
TSaplingTransaction Natural
n) TypeAnn
t)

t_saplingTransactionDeprecated :: Parser a -> Parser (a, Ty)
t_saplingTransactionDeprecated :: forall a. Parser a -> Parser (a, Ty)
t_saplingTransactionDeprecated Parser a
_ = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"sapling_transaction_deprecated"
  String -> Parser (a, Ty)
forall a. String -> ParsecT CustomParserException Text Identity a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Use of deprecated type: sapling_transaction_deprecated"

t_lambda :: (Default a) => Parser a -> Parser (a, Ty)
t_lambda :: forall a. Default a => Parser a -> Parser (a, Ty)
t_lambda Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"lambda"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- Parser Ty
type_
  Ty
b <- Parser Ty
type_
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> Ty -> T
TLambda Ty
a Ty
b) TypeAnn
t)

-- Container types
t_list :: forall a. (Default a) => Parser a -> Parser (a, Ty)
t_list :: forall a. Default a => Parser a -> Parser (a, Ty)
t_list Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"list"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- Parser Ty
type_
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> T
TList Ty
a) TypeAnn
t)

t_set :: forall a. (Default a) => Parser a -> Parser (a, Ty)
t_set :: forall a. Default a => Parser a -> Parser (a, Ty)
t_set Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"set"
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- Parser Ty
type_
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> T
TSet Ty
a) TypeAnn
t)

t_map_like
  :: (Default a)
  => Parser a -> Parser (Ty, Ty, a, TypeAnn)
t_map_like :: forall a. Default a => Parser a -> Parser (Ty, Ty, a, TypeAnn)
t_map_like Parser a
fp = do
  (a
f, TypeAnn
t) <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  Ty
a <- Parser Ty
type_
  Ty
b <- Parser Ty
type_
  return (Ty
a, Ty
b, a
f, TypeAnn
t)

t_map :: (Default a) => Parser a -> Parser (a, Ty)
t_map :: forall a. Default a => Parser a -> Parser (a, Ty)
t_map Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"map"
  (Ty
a, Ty
b, a
f, TypeAnn
t) <- Parser a -> Parser (Ty, Ty, a, TypeAnn)
forall a. Default a => Parser a -> Parser (Ty, Ty, a, TypeAnn)
t_map_like Parser a
fp
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> Ty -> T
TMap Ty
a Ty
b) TypeAnn
t)

t_big_map :: (Default a) => Parser a -> Parser (a, Ty)
t_big_map :: forall a. Default a => Parser a -> Parser (a, Ty)
t_big_map Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"big_map"
  (Ty
a, Ty
b, a
f, TypeAnn
t) <- Parser a -> Parser (Ty, Ty, a, TypeAnn)
forall a. Default a => Parser a -> Parser (Ty, Ty, a, TypeAnn)
t_map_like Parser a
fp
  return (a
f, T -> TypeAnn -> Ty
Ty (Ty -> Ty -> T
TBigMap Ty
a Ty
b) TypeAnn
t)

t_txRollupL2Address :: Default a => Parser a -> Parser (a, Ty)
t_txRollupL2Address :: forall a. Default a => Parser a -> Parser (a, Ty)
t_txRollupL2Address Parser a
fp = do
  Tokens Text -> Parser ()
symbol1 Text
Tokens Text
"tx_rollup_l2_address"
  (a, TypeAnn)
_ <- Parser a -> Parser (a, TypeAnn)
forall a. Default a => Parser a -> Parser (a, TypeAnn)
fieldType Parser a
fp
  String -> Parser (a, Ty)
forall a. String -> ParsecT CustomParserException Text Identity a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Transaction rollups are not supported"