diff options
| author | demo <demo@antix1> | 2026-05-30 11:14:26 -0400 |
|---|---|---|
| committer | demo <demo@antix1> | 2026-05-30 11:14:26 -0400 |
| commit | 859af872373e4768e19c37cabe1b988f69bee070 (patch) | |
| tree | f245df81661d5b439df132a5c746ba005f9e9ee3 | |
| parent | 7bf10c9eca81791212ce6808c1a5be2acea03c97 (diff) | |
feat: implement basic assertion modeling
Right now we can do implication, negation, double implication, and,
or, and xor. That might be all we need for now.
| -rw-r--r-- | hamlet.go | 57 | ||||
| -rw-r--r-- | hamlet_test.go | 14 |
2 files changed, 71 insertions, 0 deletions
diff --git a/hamlet.go b/hamlet.go new file mode 100644 index 0000000..1bdcc94 --- /dev/null +++ b/hamlet.go @@ -0,0 +1,57 @@ +package hamlet + +import "reflect" + +type Assertion struct { + value bool +} + +func (a Assertion) Value() bool { + return a.value +} + +// False reports whether v contains a zero value for its type. +func False(v any) Assertion { + return Assertion{reflect.ValueOf(v).IsZero()} +} + +// True reports whether v contains a non-zero value for its type. +func True(v any) Assertion { + return Assertion{!reflect.ValueOf(v).IsZero()} +} + +func New(v any) Assertion { + return Assertion{!reflect.ValueOf(v).IsZero()} +} + +func Not(a Assertion) Assertion { + negation := !a.value + + return Assertion{negation} +} + +func Or(a Assertion, b Assertion) Assertion { + av := a.value + bv := b.value + + return Assertion{av || bv} +} + +func And(a Assertion, b Assertion) Assertion { + av := a.value + bv := b.value + + return Assertion{av && bv} +} + +func If(a Assertion, b Assertion) Assertion { + return Or(Not(a), b) +} + +func Iff(a Assertion, b Assertion) Assertion { + return And(If(a, b), If(b, a)) +} + +func Xor(a Assertion, b Assertion) Assertion { + return Not(Iff(a, b)) +} diff --git a/hamlet_test.go b/hamlet_test.go new file mode 100644 index 0000000..d216617 --- /dev/null +++ b/hamlet_test.go @@ -0,0 +1,14 @@ +package hamlet + +import ( + "fmt" + "testing" +) + +func TestAssertion(t *testing.T) { + prop1 := New(4) + prop2 := New("") + + fmt.Println(If(prop2, prop1)) + fmt.Println(If(prop1, prop2)) +} |
