1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
use crate::Signal; use Signal::*; pub fn and<T>(a: T, b: T) -> Signal where T: Into<Signal>, { match (a.into(), b.into()) { (On, On) => On, _ => Off, } } pub fn nand<T>(a: T, b: T) -> Signal where T: Into<Signal>, { not(and(a, b)) } pub fn nor<T>(a: T, b: T) -> Signal where T: Into<Signal>, { not(or(a, b)) } pub fn xor<T>(a: T, b: T) -> Signal where T: Into<Signal>, { match (a.into(), b.into()) { (On, Off) | (Off, On) => On, _ => Off, } } pub fn or<T>(a: T, b: T) -> Signal where T: Into<Signal>, { match (a.into(), b.into()) { (Off, Off) => Off, _ => On, } } pub fn not<T>(a: T) -> Signal where T: Into<Signal>, { match a.into() { Off => On, On => Off, } } #[cfg(test)] mod test { use super::*; #[test] fn t_and() { assert_eq!(and(Off, Off), Off); assert_eq!(and(On, Off), Off); assert_eq!(and(Off, On), Off); assert_eq!(and(On, On), On); } #[test] fn t_or() { assert_eq!(or(Off, Off), Off); assert_eq!(or(On, Off), On); assert_eq!(or(Off, On), On); assert_eq!(or(On, On), On); } #[test] fn t_nand() { assert_eq!(nand(Off, Off), On); assert_eq!(nand(On, Off), On); assert_eq!(nand(Off, On), On); assert_eq!(nand(On, On), Off); } #[test] fn t_nor() { assert_eq!(nor(Off, Off), On); assert_eq!(nor(On, Off), Off); assert_eq!(nor(Off, On), Off); assert_eq!(nor(On, On), Off); } #[test] fn t_xor() { assert_eq!(xor(Off, Off), Off); assert_eq!(xor(On, Off), On); assert_eq!(xor(Off, On), On); assert_eq!(xor(On, On), Off); } }