1use std::{fmt::Display, hash::Hash};
2
3#[derive(Hash, PartialEq, Eq, Debug, Clone)]
5pub enum Atom<A> {
6 Pos(A),
7 Neg(A),
8}
9
10impl<A> Atom<A>
11where
12 A: Clone,
13{
14 pub fn pos(pa: &A) -> Atom<A> {
15 Atom::Pos(pa.clone())
16 }
17
18 pub fn neg(na: &A) -> Atom<A> {
19 Atom::Neg(na.clone())
20 }
21
22 pub fn negated(&self) -> Atom<A> {
23 match self {
24 Atom::Pos(value) => Atom::Neg(value.clone()),
25 Atom::Neg(value) => Atom::Pos(value.clone()),
26 }
27 }
28
29 pub fn get_value(&self) -> &A {
30 match self {
31 Atom::Pos(value) => value,
32 Atom::Neg(value) => value,
33 }
34 }
35}
36
37impl<A> Display for Atom<A>
38where
39 A: Display,
40{
41 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42 match self {
43 Atom::Pos(value) => write!(f, "+({})", value),
44 Atom::Neg(value) => write!(f, "!({})", value),
45 }
46 }
47}