aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/target/jvm/type/parser.lux
diff options
context:
space:
mode:
authorEduardo Julian2021-07-14 13:59:02 -0400
committerEduardo Julian2021-07-14 13:59:02 -0400
commitd6c48ae6a8b58f5974133170863a31c70f0123d1 (patch)
tree008eb88328009e2f3f07002f35c0378a8a137ed0 /stdlib/source/library/lux/target/jvm/type/parser.lux
parent2431e767a09894c2f685911ba7f1ba0b7de2a165 (diff)
Normalized the hierarchy of the standard library modules.
Diffstat (limited to 'stdlib/source/library/lux/target/jvm/type/parser.lux')
-rw-r--r--stdlib/source/library/lux/target/jvm/type/parser.lux253
1 files changed, 253 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/target/jvm/type/parser.lux b/stdlib/source/library/lux/target/jvm/type/parser.lux
new file mode 100644
index 000000000..5b9a3e1af
--- /dev/null
+++ b/stdlib/source/library/lux/target/jvm/type/parser.lux
@@ -0,0 +1,253 @@
+(.module:
+ [library
+ [lux (#- Type int char primitive)
+ [abstract
+ [monad (#+ do)]]
+ [control
+ ["." try]
+ ["." function]
+ ["<>" parser ("#\." monad)
+ ["<t>" text (#+ Parser)]]]
+ [data
+ ["." product]
+ [text
+ ["%" format (#+ format)]]
+ [collection
+ ["." list]]]]]
+ ["." // (#+ Type)
+ [category (#+ Void Value Return Method Primitive Object Class Array Var Parameter Declaration)]
+ ["#." signature]
+ ["#." descriptor]
+ ["." // #_
+ [encoding
+ ["#." name (#+ External)]]]])
+
+(template [<category> <name> <signature> <type>]
+ [(def: #export <name>
+ (Parser (Type <category>))
+ (<>.after (<t>.this (//signature.signature <signature>))
+ (<>\wrap <type>)))]
+
+ [Void void //signature.void //.void]
+ [Primitive boolean //signature.boolean //.boolean]
+ [Primitive byte //signature.byte //.byte]
+ [Primitive short //signature.short //.short]
+ [Primitive int //signature.int //.int]
+ [Primitive long //signature.long //.long]
+ [Primitive float //signature.float //.float]
+ [Primitive double //signature.double //.double]
+ [Primitive char //signature.char //.char]
+ [Parameter wildcard //signature.wildcard //.wildcard]
+ )
+
+(def: #export primitive
+ (Parser (Type Primitive))
+ ($_ <>.either
+ ..boolean
+ ..byte
+ ..short
+ ..int
+ ..long
+ ..float
+ ..double
+ ..char
+ ))
+
+(def: var/head
+ (format "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "_"))
+
+(def: var/tail
+ (format var/head
+ "0123456789$"))
+
+(def: class/set
+ (format var/tail //name.internal_separator))
+
+(template [<type> <name> <head> <tail> <adapter>]
+ [(def: #export <name>
+ (Parser <type>)
+ (\ <>.functor map <adapter>
+ (<t>.slice (<t>.and! (<t>.one_of! <head>)
+ (<t>.some! (<t>.one_of! <tail>))))))]
+
+ [External class_name class/set class/set (|>> //name.internal //name.external)]
+ [Text var_name var/head var/tail function.identity]
+ )
+
+(def: #export var'
+ (Parser Text)
+ (|> ..var_name
+ (<>.after (<t>.this //signature.var_prefix))
+ (<>.before (<t>.this //descriptor.class_suffix))))
+
+(def: #export var
+ (Parser (Type Var))
+ (<>\map //.var ..var'))
+
+(def: #export var?
+ (-> (Type Value) (Maybe Text))
+ (|>> //.signature
+ //signature.signature
+ (<t>.run ..var')
+ try.to_maybe))
+
+(def: #export name
+ (-> (Type Var) Text)
+ (|>> //.signature
+ //signature.signature
+ (<t>.run ..var')
+ try.assume))
+
+(template [<name> <prefix> <constructor>]
+ [(def: <name>
+ (-> (Parser (Type Class)) (Parser (Type Parameter)))
+ (|>> (<>.after (<t>.this <prefix>))
+ (<>\map <constructor>)))]
+
+ [lower //signature.lower_prefix //.lower]
+ [upper //signature.upper_prefix //.upper]
+ )
+
+(def: (class'' parameter)
+ (-> (Parser (Type Parameter)) (Parser [External (List (Type Parameter))]))
+ (|> (do <>.monad
+ [name ..class_name
+ parameters (|> (<>.some parameter)
+ (<>.after (<t>.this //signature.parameters_start))
+ (<>.before (<t>.this //signature.parameters_end))
+ (<>.default (list)))]
+ (wrap [name parameters]))
+ (<>.after (<t>.this //descriptor.class_prefix))
+ (<>.before (<t>.this //descriptor.class_suffix))))
+
+(def: class'
+ (-> (Parser (Type Parameter)) (Parser (Type Class)))
+ (|>> ..class''
+ (\ <>.monad map (product.uncurry //.class))))
+
+(def: #export parameter
+ (Parser (Type Parameter))
+ (<>.rec
+ (function (_ parameter)
+ (let [class (..class' parameter)]
+ ($_ <>.either
+ ..var
+ ..wildcard
+ (..lower class)
+ (..upper class)
+ class
+ )))))
+
+(def: #export array'
+ (-> (Parser (Type Value)) (Parser (Type Array)))
+ (|>> (<>.after (<t>.this //descriptor.array_prefix))
+ (<>\map //.array)))
+
+(def: #export class
+ (Parser (Type Class))
+ (..class' ..parameter))
+
+(template [<name> <prefix> <constructor>]
+ [(def: #export <name>
+ (-> (Type Value) (Maybe (Type Class)))
+ (|>> //.signature
+ //signature.signature
+ (<t>.run (<>.after (<t>.this <prefix>) ..class))
+ try.to_maybe))]
+
+ [lower? //signature.lower_prefix //.lower]
+ [upper? //signature.upper_prefix //.upper]
+ )
+
+(def: #export read_class
+ (-> (Type Class) [External (List (Type Parameter))])
+ (|>> //.signature
+ //signature.signature
+ (<t>.run (..class'' ..parameter))
+ try.assume))
+
+(def: #export value
+ (Parser (Type Value))
+ (<>.rec
+ (function (_ value)
+ ($_ <>.either
+ ..primitive
+ ..parameter
+ (..array' value)
+ ))))
+
+(def: #export array
+ (Parser (Type Array))
+ (..array' ..value))
+
+(def: #export object
+ (Parser (Type Object))
+ ($_ <>.either
+ ..class
+ ..array))
+
+(def: inputs
+ (|> (<>.some ..value)
+ (<>.after (<t>.this //signature.arguments_start))
+ (<>.before (<t>.this //signature.arguments_end))))
+
+(def: #export return
+ (Parser (Type Return))
+ (<>.either ..void
+ ..value))
+
+(def: exception
+ (Parser (Type Class))
+ (|> (..class' ..parameter)
+ (<>.after (<t>.this //signature.exception_prefix))))
+
+(def: #export method
+ (-> (Type Method)
+ [(List (Type Value)) (Type Return) (List (Type Class))])
+ (let [parser (do <>.monad
+ [inputs ..inputs
+ return ..return
+ exceptions (<>.some ..exception)]
+ (wrap [inputs return exceptions]))]
+ (|>> //.signature
+ //signature.signature
+ (<t>.run parser)
+ try.assume)))
+
+(template [<name> <category> <parser>]
+ [(def: #export <name>
+ (-> (Type Value) (Maybe <category>))
+ (|>> //.signature
+ //signature.signature
+ (<t>.run <parser>)
+ try.to_maybe))]
+
+ [array? (Type Value)
+ (do <>.monad
+ [_ (<t>.this //descriptor.array_prefix)]
+ ..value)]
+ [class? [External (List (Type Parameter))]
+ (..class'' ..parameter)]
+
+ [primitive? (Type Primitive) ..primitive]
+ [wildcard? (Type Parameter) ..wildcard]
+ [parameter? (Type Parameter) ..parameter]
+ [object? (Type Object) ..object]
+ )
+
+(def: #export declaration
+ (-> (Type Declaration) [External (List (Type Var))])
+ (let [declaration' (: (Parser [External (List (Type Var))])
+ (|> (<>.and ..class_name
+ (|> (<>.some ..var)
+ (<>.after (<t>.this //signature.parameters_start))
+ (<>.before (<t>.this //signature.parameters_end))
+ (<>.default (list))))
+ (<>.after (<t>.this //descriptor.class_prefix))
+ (<>.before (<t>.this //descriptor.class_suffix))))]
+ (|>> //.signature
+ //signature.signature
+ (<t>.run declaration')
+ try.assume)))