package hamlet import "reflect" type Assertion struct { truth bool } func (a Assertion) Assert() bool { return a.truth } func Present(v any) Assertion { return Assertion{!reflect.ValueOf(v).IsZero()} } func Absent(v any) Assertion { return Assertion{reflect.ValueOf(v).IsZero()} } // Not computes ~a, given assertion a. func Not(a Assertion) Assertion { negation := !a.truth return Assertion{negation} } // Or computes a v b, given assertions a and b. func Or(a Assertion, b Assertion) Assertion { av := a.truth bv := b.truth return Assertion{av || bv} } // And computes a ^ b, given assertions a and b. func And(a Assertion, b Assertion) Assertion { av := a.truth bv := b.truth return Assertion{av && bv} } // If computes a → b, given assertions a and b. func If(a Assertion, b Assertion) Assertion { return Or(Not(a), b) } // If computes a ↔ b, given assertions a and b. func Iff(a Assertion, b Assertion) Assertion { return And(If(a, b), If(b, a)) } // Xor computes a ⊻ b, given assertions a and b. func Xor(a Assertion, b Assertion) Assertion { return Not(Iff(a, b)) }