verdict_parser/common/
option_deep.rs1use super::*;
2use vstd::prelude::*;
3
4verus! {
5
6#[derive(Debug, View, PolyfillClone, Structural, Eq, PartialEq)]
8pub enum OptionDeep<T> {
9 Some(T),
10 None,
11}
12
13impl<T> OptionDeep<T> {
14 pub open spec fn spec_unwrap_or(self, default: T) -> T {
15 match self {
16 OptionDeep::Some(t) => t,
17 OptionDeep::None => default,
18 }
19 }
20
21 #[verifier::when_used_as_spec(spec_unwrap_or)]
22 #[inline(always)]
23 pub fn unwrap_or(self, default: T) -> (res: T)
24 ensures res == self.spec_unwrap_or(default)
25 {
26 match self {
27 OptionDeep::Some(t) => t,
28 OptionDeep::None => default,
29 }
30 }
31
32 pub open spec fn spec_as_ref(&self) -> Option<&T> {
33 match self {
34 OptionDeep::Some(t) => Some(t),
35 OptionDeep::None => None,
36 }
37 }
38
39 #[verifier::when_used_as_spec(spec_as_ref)]
40 #[inline(always)]
41 pub fn as_ref(&self) -> (res: Option<&T>)
42 ensures res == self.spec_as_ref()
43 {
44 match self {
45 OptionDeep::Some(t) => Some(t),
46 OptionDeep::None => None,
47 }
48 }
49
50 pub open spec fn spec_from_opt(opt: Option<T>) -> Self {
51 match opt {
52 Some(t) => OptionDeep::Some(t),
53 None => OptionDeep::None,
54 }
55 }
56
57 #[verifier::when_used_as_spec(spec_from_opt)]
58 #[inline(always)]
59 pub fn from_opt(opt: Option<T>) -> (res: Self)
60 ensures res == Self::spec_from_opt(opt)
61 {
62 match opt {
63 Some(t) => OptionDeep::Some(t),
64 None => OptionDeep::None,
65 }
66 }
67
68 pub open spec fn spec_to_opt(self) -> Option<T> {
69 match self {
70 OptionDeep::Some(t) => Some(t),
71 OptionDeep::None => None,
72 }
73 }
74
75 #[verifier::when_used_as_spec(spec_to_opt)]
76 #[inline(always)]
77 pub fn to_opt(self) -> (res: Option<T>)
78 ensures res == self.spec_to_opt()
79 {
80 match self {
81 OptionDeep::Some(t) => Some(t),
82 OptionDeep::None => None,
83 }
84 }
85}
86
87}