11open Belt ;
22
33module Ast = {
4+ /** Applies a method with arguments.*/
45let apply = (func: string , args: array (string ))=>
56 func++ "(" ++ Js . Array . joinWith("," , args)++ ")" ;
67
8+ /** Decorates a block with a decorator.*/
79let decorate = (decorator: string , statement: string )=>
810"[@" ++ decorator++ "] " ++ statement;
911};
1012
1113module Decorators = {
14+ /** Marks a block with [@bs.optional].*/
1215let bsOptional = Ast . decorate("bs.optional" );
16+
17+ /** Marks a block with [@bs.as "name"].*/
1318let bsAs = name=> Ast . decorate("bs.as\" " ++ name++ "\" " );
19+
20+ /** Marks a block with [@bs.module "name"].*/
1421let bsModule = (~module_=?, statement)=> {
1522let decorator =
1623switch (module_) {
@@ -19,10 +26,13 @@ module Decorators = {
1926 };
2027Ast . decorate(decorator, statement);
2128 };
29+
30+ /** Marks a block with [@bs.deriving value].*/
2231let bsDeriving = deriving=> Ast . decorate("bs.deriving " ++ deriving);
2332};
2433
2534module Types = {
35+ /** Creates a Reason record type. ts is (key, value, optional).*/
2636let record_ = ts=> {
2737let fields =
2838Array . map(
@@ -40,6 +50,7 @@ module Types = {
4050"{ " ++ Js . Array . joinWith("" , fields)++ "}" ;
4151 };
4252
53+ /** Creates a JS object type. ts is (key, value).*/
4354let jsRecord = ts=> {
4455let fields =
4556Array . map(ts, ((name, t))=> "\" " ++ name++ "\" : " ++ t++ ", " );
@@ -101,3 +112,19 @@ let type_ = (name, t) => "type " ++ name ++ " = " ++ t ++ ";";
101112
102113let external_ = (name, type_, exported)=>
103114"external " ++ name++ " : " ++ type_++ " = " ++ "\" " ++ exported++ "\" ;" ;
115+
116+ let let_ = (name, value)=> "let " ++ name++ " = " ++ value++ ";" ;
117+
118+ /** Creates a function. ts is (name, labeled, default).*/
119+ let function_ = (ts, returnValue)=> {
120+ let paramStrs =
121+ Array . map(ts, param=>
122+ switch (param) {
123+ | (name , false , _ )=> name
124+ | (name , true , None )=> "~" ++ name
125+ | (name , true , Some (value ))=> "~" ++ name++ "=" ++ value
126+ }
127+ );
128+ let params = Js . Array . joinWith(", " , paramStrs);
129+ "(" ++ params++ ") => {" ++ returnValue++ "}" ;
130+ };