From 3988df549bfa8bdfb142afd05a66f6f640a030ca Mon Sep 17 00:00:00 2001 From: Elias Tazartes Date: Wed, 4 Oct 2023 18:02:59 +0700 Subject: [PATCH 1/4] feat: add unwrap_or and unwrap_default does not compile --- corelib/src/option.cairo | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/corelib/src/option.cairo b/corelib/src/option.cairo index 31c3148dbac..c1bd65aeb79 100644 --- a/corelib/src/option.cairo +++ b/corelib/src/option.cairo @@ -8,6 +8,7 @@ enum Option { None, } + trait OptionTrait { /// If `val` is `Option::Some(x)`, returns `x`. Otherwise, panics with `err`. fn expect(self: Option, err: felt252) -> T; @@ -20,6 +21,10 @@ trait OptionTrait { fn is_some(self: @Option) -> bool; /// Returns `true` if the `Option` is `Option::None`. fn is_none(self: @Option) -> bool; + /// Returns x if Option is Option::some(x), otherwise returns the provided default value + fn unwrap_or(self: Option, default: T) -> T; + /// Returns x if Option is Option::some(x), otherwise returns Default::::default() + fn unwrap_or_default(self: Option) -> T; } impl OptionTraitImpl of OptionTrait { #[inline(always)] @@ -58,4 +63,19 @@ impl OptionTraitImpl of OptionTrait { Option::None => true, } } + + #[inline(always)] + fn unwrap_or(self: Option, default: T) -> T { + match self { + Option::Some(x) => x, + Option::None => default, + } + } + + fn unwrap_or_default(self: Option) -> T { + match self { + Option::Some(x) => x, + Option::None => Default::default(), + } + } } From 9dc956837d46e30f3caaac832daeac06ed80f001 Mon Sep 17 00:00:00 2001 From: Elias Tazartes Date: Thu, 5 Oct 2023 11:52:14 +0700 Subject: [PATCH 2/4] feat: add trait bounds --- corelib/src/option.cairo | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/corelib/src/option.cairo b/corelib/src/option.cairo index c1bd65aeb79..c4daa4ff644 100644 --- a/corelib/src/option.cairo +++ b/corelib/src/option.cairo @@ -1,14 +1,9 @@ -use array::ArrayTrait; -use serde::Serde; -use array::SpanTrait; - #[derive(Copy, Drop, Serde, PartialEq)] enum Option { Some: T, None, } - trait OptionTrait { /// If `val` is `Option::Some(x)`, returns `x`. Otherwise, panics with `err`. fn expect(self: Option, err: felt252) -> T; @@ -22,10 +17,11 @@ trait OptionTrait { /// Returns `true` if the `Option` is `Option::None`. fn is_none(self: @Option) -> bool; /// Returns x if Option is Option::some(x), otherwise returns the provided default value - fn unwrap_or(self: Option, default: T) -> T; + fn unwrap_or<+Drop>(self: Option, default: T) -> T; /// Returns x if Option is Option::some(x), otherwise returns Default::::default() - fn unwrap_or_default(self: Option) -> T; + fn unwrap_or_default<+Default>(self: Option) -> T; } + impl OptionTraitImpl of OptionTrait { #[inline(always)] fn expect(self: Option, err: felt252) -> T { @@ -64,15 +60,16 @@ impl OptionTraitImpl of OptionTrait { } } - #[inline(always)] - fn unwrap_or(self: Option, default: T) -> T { + #[inline] + fn unwrap_or<+Drop>(self: Option, default: T) -> T { match self { Option::Some(x) => x, Option::None => default, } } - fn unwrap_or_default(self: Option) -> T { + #[inline] + fn unwrap_or_default<+Default>(self: Option) -> T { match self { Option::Some(x) => x, Option::None => Default::default(), From 9d65a59a106bfb1443a2cf345f7486d55d109bf7 Mon Sep 17 00:00:00 2001 From: Elias Tazartes Date: Thu, 12 Oct 2023 19:05:18 +0800 Subject: [PATCH 3/4] refactor: incorporate recommended changes --- corelib/src/option.cairo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/corelib/src/option.cairo b/corelib/src/option.cairo index c4daa4ff644..3fbe1281d44 100644 --- a/corelib/src/option.cairo +++ b/corelib/src/option.cairo @@ -16,9 +16,9 @@ trait OptionTrait { fn is_some(self: @Option) -> bool; /// Returns `true` if the `Option` is `Option::None`. fn is_none(self: @Option) -> bool; - /// Returns x if Option is Option::some(x), otherwise returns the provided default value + /// Returns x if Option is Option::some(x), otherwise returns the provided default value. fn unwrap_or<+Drop>(self: Option, default: T) -> T; - /// Returns x if Option is Option::some(x), otherwise returns Default::::default() + /// Returns x if Option is Option::some(x), otherwise returns Default::::default(). fn unwrap_or_default<+Default>(self: Option) -> T; } From 53de36289f2f4960daa5b892c771c80e41fb79d1 Mon Sep 17 00:00:00 2001 From: Elias Tazartes Date: Thu, 12 Oct 2023 20:00:17 +0800 Subject: [PATCH 4/4] fix: fix suggestions --- corelib/src/option.cairo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/corelib/src/option.cairo b/corelib/src/option.cairo index 3fbe1281d44..ea269337657 100644 --- a/corelib/src/option.cairo +++ b/corelib/src/option.cairo @@ -16,9 +16,9 @@ trait OptionTrait { fn is_some(self: @Option) -> bool; /// Returns `true` if the `Option` is `Option::None`. fn is_none(self: @Option) -> bool; - /// Returns x if Option is Option::some(x), otherwise returns the provided default value. + /// If `self` is `Option::Some(x)`, returns `x`. Otherwise, returns the provided default. fn unwrap_or<+Drop>(self: Option, default: T) -> T; - /// Returns x if Option is Option::some(x), otherwise returns Default::::default(). + /// If `self` is `Option::Some(x)`, returns `x`. Otherwise, returns `Default::::default()`. fn unwrap_or_default<+Default>(self: Option) -> T; }