On 10/6/19 5:45 PM, Mark Clements wrote:
In defining an FFI to a JavaScript library such as Chart.js, config options may be defined in terms of (nested) JavaScript objects with a range of potential keys/fields. Analogous to the xml tags, is there any way to define a record type in Ur/Web that potentially includes a subset of fields?

In my own FFI wrapping so far, I have just given fields [option] types when they are optional, dealing with writing in [None] values for unused fields manually.  I don't think it's so bad!

Since I never miss an opportunity to show off metaprogramming in Ur/Web, here's a function you can use to cast a record to a wider type where all the new fields have [option] types.

fun expand [original ::: {Type}] [additional ::: {Type}] [original ~ additional]
           (fl : folder additional) (r : $original)
    : $(original ++ map option additional) =
    r ++ @map0 [option] (fn [t ::_] => None) fl

fun foo (x : {A : int, B : option string, C : float, D : option bool, E : string}) =
    42

val example = foo (expand {A = 3, C = 1.234, D = Some True, E = "hi"})


_______________________________________________
Ur mailing list
Ur@impredicative.com
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to