diff --git a/corelib/src/option.cairo b/corelib/src/option.cairo index 31c3148dbac..ea269337657 100644 --- a/corelib/src/option.cairo +++ b/corelib/src/option.cairo @@ -1,7 +1,3 @@ -use array::ArrayTrait; -use serde::Serde; -use array::SpanTrait; - #[derive(Copy, Drop, Serde, PartialEq)] enum Option { Some: T, @@ -20,7 +16,12 @@ trait OptionTrait { fn is_some(self: @Option) -> bool; /// Returns `true` if the `Option` is `Option::None`. fn is_none(self: @Option) -> bool; + /// If `self` is `Option::Some(x)`, returns `x`. Otherwise, returns the provided default. + fn unwrap_or<+Drop>(self: Option, default: T) -> T; + /// If `self` is `Option::Some(x)`, returns `x`. Otherwise, returns `Default::::default()`. + fn unwrap_or_default<+Default>(self: Option) -> T; } + impl OptionTraitImpl of OptionTrait { #[inline(always)] fn expect(self: Option, err: felt252) -> T { @@ -58,4 +59,20 @@ impl OptionTraitImpl of OptionTrait { Option::None => true, } } + + #[inline] + fn unwrap_or<+Drop>(self: Option, default: T) -> T { + match self { + Option::Some(x) => x, + Option::None => default, + } + } + + #[inline] + fn unwrap_or_default<+Default>(self: Option) -> T { + match self { + Option::Some(x) => x, + Option::None => Default::default(), + } + } }