1use crate::{
25 Outdegree,
26 Vertices,
27};
28
29pub trait Sinks {
31 #[must_use]
52 fn sinks(&self) -> impl Iterator<Item = usize>;
53}
54
55impl<D> Sinks for D
56where
57 D: Outdegree + Vertices,
58{
59 fn sinks(&self) -> impl Iterator<Item = usize> {
60 self.vertices().filter(move |&u| self.is_sink(u))
61 }
62}
63
64#[macro_export]
66macro_rules! test_sinks {
67 ($fixture:path) => {
68 use $fixture::{
69 bang_jensen_34,
70 bang_jensen_94,
71 bang_jensen_196,
72 kattis_builddeps,
73 kattis_cantinaofbabel_1,
74 kattis_cantinaofbabel_2,
75 kattis_escapewallmaria_1,
76 kattis_escapewallmaria_2,
77 kattis_escapewallmaria_3,
78 };
79
80 #[test]
81 fn sinks_bang_jensen_196() {
82 assert!(bang_jensen_196().sinks().eq([]));
83 }
84
85 #[test]
86 fn sinks_bang_jensen_34() {
87 assert!(bang_jensen_34().sinks().eq([3, 4]));
88 }
89
90 #[test]
91 fn sinks_bang_jensen_94() {
92 assert!(bang_jensen_94().sinks().eq([5, 6]));
93 }
94
95 #[test]
96 fn sinks_kattis_builddeps() {
97 assert!(kattis_builddeps().sinks().eq([1]));
98 }
99
100 #[test]
101 fn sinks_kattis_cantinaofbabel_1() {
102 assert!(kattis_cantinaofbabel_1().sinks().eq([]));
103 }
104
105 #[test]
106 fn sinks_kattis_cantinaofbabel_2() {
107 assert!(kattis_cantinaofbabel_2().sinks().eq([]));
108 }
109
110 #[test]
111 fn sinks_kattis_escapewallmaria_1() {
112 assert!(
113 kattis_escapewallmaria_1()
114 .sinks()
115 .eq([0, 1, 2, 3, 4, 7, 8, 10, 11, 12, 14, 15])
116 );
117 }
118
119 #[test]
120 fn sinks_kattis_escapewallmaria_2() {
121 assert!(
122 kattis_escapewallmaria_2()
123 .sinks()
124 .eq([0, 1, 2, 3, 4, 7, 8, 10, 11, 14, 15])
125 );
126 }
127
128 #[test]
129 fn sinks_kattis_escapewallmaria_3() {
130 assert!(
131 kattis_escapewallmaria_3()
132 .sinks()
133 .eq([0, 3, 4, 7, 8, 10, 11, 14, 15])
134 );
135 }
136 };
137}