export type Methods = { map:(f:(_:A)=>B)=>Option } export type Option = ({ kind:"none" } | { kind:"some", value:A }) & Methods export let none = function() : Option { return { kind:"none", map:function(this:Option, f:(_:A)=>B){ return map(f)(this) } } } export let some = function(x:A) : Option { return { kind:"some", value:x, map:function(this:Option, f:(_:A)=>B){ return map(f)(this) } } } let map = function(f:(_:A)=>B) : (x:Option) => Option { return x => x.kind == "none" ? none() : some(f(x.value)) }