Comments (7)
Definitely something like:
val safeTagNameCast : 'a -> 'b kind -> 'b
Could be re-used!
from bs-webapi-incubator.
@glennsl You could do something like:
type image
external src : image -> string -> unit = "" [@@bs.set]
(* .. add function on image *)
type paragraph
(* .. add function on paragraph *)
type link
(* .. add function on link *)
type _ kind =
| Image : image kind
| Paragraph : paragraph kind
| Link : link kind
module Document : sig
type t
val dom : t
val createElement : t -> 'a kind -> 'a
end = struct
type t
external dom : t = "dom" [@@bs.val]
external createElementEx : t -> string -> 'a = "createElement" [@@bs.send]
let createElement :
type a. t -> a kind -> a =
fun t kind ->
match kind with
| Image -> createElementEx t "img"
| Paragraph -> createElementEx t "p"
| Link -> createElementEx t "a"
end
let () =
let img1 = Document.createElement Document.dom Image in
src img1 "blah.jpg";
let p1 = Document.createElement Document.dom Paragraph in
src p1 "blah.jpg" (* Compilation Error *)
from bs-webapi-incubator.
@mransan Thanks! This is precisely what I was thinking of, but unable to actually formulate.
So then we'd have to maintain a massive variant, and a massive match in any function that uses it, as opposed to maintaining a whole boatload of separate functions in each element's module.
What does this mean for the extensibility and maintenance of the API as the DOM and HTML specifications change? This is of course the classic expression problem, but which is more important for a DOM API, the ability to easily add new kinds, or the ability to easily add new functions that operate on them?
Pros:
- We won't need to add otherwise empty modules for element interfaces that don't add any additional functionality.
getElementsByTagName
would certainly be more intuitive to use- This could theoretically be used even for functions such as
getElementById
- Is user extensible
- The same pattern could be applied to e.g. nodeType.
Cons:
- Will produce a big switch that adds to code size and runtime cost for each function that will use this
- Confusing interaction with subtyping?
I'm just thinking out loud here. What are your thoughts on the tradeoffs?
from bs-webapi-incubator.
Regarding getElementById, you would also have to do some check to make sure the element tag name is matching the GADT constructor no ?
from bs-webapi-incubator.
Yeah you'd have to check the tagName
, which I doubt we want to do for the default "getElementById", but we could perhaps have an overload that does so. But it's nice to have the option at least, and it will probably be useful for other functions too.
from bs-webapi-incubator.
@glennsl I need to understand the subtyping better before making an opinion :)
from bs-webapi-incubator.
Understandable. Fortunately I wrote an essay on it 😁
from bs-webapi-incubator.
Related Issues (20)
- Function for converting Node to real type HOT 1
- Project name HOT 2
- Nodelist forEach HOT 2
- Dom.Image does not exist (the current Dom.Image should be Dom.ImageData)?
- adding bindings to HtmlVideoElement HOT 3
- Binding for XHR HOT 1
- Classify for Dom.node HOT 4
- Adding replaceChild
- Canvas2d.putImageData creates erroneous calls when not using all the optionals. HOT 3
- Could be possible to perform auto-generation from WebIDL? HOT 3
- Bsdoc dependency makes contributing a bit difficult on Linux HOT 2
- Binding for URLSearchParams.entries() is incorrect
- Add bindings for HtmlTemplateElement
- unmet peer dependency warning HOT 1
- Regarding document.documentElement.scrollTop HOT 2
- Add functor to type CustomEvent.detail
- How to use HtmlInputElement (focus, select) ? HOT 5
- How to use addEventListener on window HOT 3
- Add DataTransfer bindings
- unsafeAsHtmlInputElement
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bs-webapi-incubator.