// SPDX-License-Identifier: MPL-2.0
// Example: Using SafeDOM for formally verified DOM mounting
open SafeDOM
// Example 1: Basic mounting with error handling
let mountApp = () => {
mountSafe(
"#app",
"
Hello, World!
Mounted safely with proofs.
",
~onSuccess=el => {
Console.log("✓ App mounted successfully!")
Console.log("Element:", el)
},
~onError=err => {
Console.error("✗ Mount failed:", err)
}
)
}
// Example 2: Wait for DOM ready before mounting
let mountWhenDOMReady = () => {
mountWhenReady(
"#app",
"
App Title
",
~onSuccess=_ => Console.log("✓ Mounted after DOM ready"),
~onError=err => Console.error("✗ Failed:", err)
)
}
// Example 3: Batch mounting (atomic - all or nothing)
let mountMultiple = () => {
let specs = [
{selector: "#header", html: "
") {
| Error(e) => Console.error(`Invalid HTML: ${e}`)
| Ok(validHtml) => {
// Now mount with proven safety
switch mount(validSelector, validHtml) {
| Mounted(el) => Console.log("✓ Mounted with validated inputs:", el)
| MountPointNotFound(s) => Console.error(`✗ Element not found: ${s}`)
| InvalidSelector(_) => Console.error("Impossible - already validated")
| InvalidHTML(_) => Console.error("Impossible - already validated")
}
}
}
}
}
// Example 5: Integration with TEA
module MyApp = {
type model = {message: string}
type msg = NoOp
let init = () => {message: "Hello from TEA"}
let update = (model, _msg) => model
let view = model => `
${model.message}
`
}
let mountTEAApp = () => {
let model = MyApp.init()
let html = MyApp.view(model)
mountWhenReady(
"#tea-app",
html,
~onSuccess=el => {
Console.log("✓ TEA app mounted")
// Set up event handlers, subscriptions here
},
~onError=err => Console.error(`✗ TEA mount failed: ${err}`)
)
}
// Entry point
let main = () => {
Console.log("SafeDOM Examples")
Console.log("================\n")
// Choose which example to run
mountWhenDOMReady() // Run on DOM ready
}
// Auto-execute when module loads
main()