(.module: [lux #* [data [product]] [type abstract]]) (abstract: #export (Tainted a) a (def: #export taint (All [a] (-> a (Tainted a))) (|>> :abstraction)) (def: #export trust (All [a] (-> (Tainted a) a)) (|>> :representation))) (def: #export (validate pred tainted) (All [a] (-> (-> a Bit) (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))