open import FRP.JS.Bool using ( Bool ; true ; false ) module FRP.JS.Maybe where -- Data.Maybe doesn't have bindings for JavaScript, so we define Maybe here. -- We'd like to use JavaScript's built-in null as the -- representation of nothing, and use x as the representation of just -- x. Unfortunately this doens't work for nested Maybes, as it -- identifies nothing and just nothing at type Maybe Maybe A, which in -- turn breaks parametericity. Instead, we link to a JS library which -- provides functions box and unbox such that box(x) !== null, -- unbox(box(x)) === x, and if x !== box^n (null) then x == -- box(x). Note that for never-null types (e.g. String), values -- of type Maybe T are either null or values of type T, which -- corresponds to the JavaScript idiom (for example, a lookup in an -- array of strings can be translated to native array lookup). data Maybe {α} (A : Set α) : Set α where just : (a : A) → Maybe A nothing : Maybe A {-# COMPILED_JS Maybe function(x,v) { if (x === null) { return v.nothing(); } else { return v.just(require("agda.box").unbox(x)); } } #-} {-# COMPILED_JS just require("agda.box").box #-} {-# COMPILED_JS nothing null #-} _≟[_]_ : ∀ {α β A B} → Maybe {α} A → (A → B → Bool) → Maybe {β} B → Bool just a ≟[ p ] just b = p a b just a ≟[ p ] nothing = false nothing ≟[ p ] just b = false nothing ≟[ p ] nothing = true