(;module: lux (lux (data [product]) (type opaque))) (opaque: #export (Tainted a) a (def: #export taint (All [a] (-> a (Tainted a))) (|>> @opaque)) (def: #export trust (All [a] (-> (Tainted a) a)) (|>> @repr))) (def: #export (validate pred tainted) (All [a] (-> (-> a Bool) (Tainted a) (Maybe a))) (let [value (trust tainted)] (if (pred value) (#;Some value) #;None))) (def: #export (sanitize f tainted) (All [a] (-> (-> a a) (Tainted a) a)) (|> tainted trust f))