sovran_arc::arcmo

Struct Arcmo

Source
pub struct Arcmo<T: Clone> { /* private fields */ }
Expand description

A wrapper combining Arc and Mutex for convenient shared mutable access to optional values Only works with types that implement Clone

Implementations§

Source§

impl<T: Clone> Arcmo<T>

Source

pub fn none() -> Self

Creates a new empty Arcmo

Examples found in repository?
examples/arcmo_example.rs (line 14)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn some(value: T) -> Self

Creates a new Arcmo containing Some(value)

Examples found in repository?
examples/arcmo_example.rs (line 6)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn modify<F, R>(&self, f: F) -> Option<R>
where F: FnOnce(&mut T) -> R,

Modifies the contained value if it exists using the provided closure

Examples found in repository?
examples/arcmo_example.rs (line 24)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn take(&self) -> Option<T>

Sets the value to None and returns the previous value if it existed

Examples found in repository?
examples/arcmo_example.rs (line 54)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn replace(&self, value: T) -> Option<T>

Sets the value to Some(value) and returns the previous value if it existed

Examples found in repository?
examples/arcmo_example.rs (line 60)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn value(&self) -> Option<T>

Returns a copy of the contained value if it exists

Examples found in repository?
examples/arcmo_example.rs (line 18)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn is_some(&self) -> bool

Returns true if the contained value is Some

Examples found in repository?
examples/arcmo_example.rs (line 19)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn is_none(&self) -> bool

Returns true if the contained value is None

Examples found in repository?
examples/arcmo_example.rs (line 20)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}
Source

pub fn downgrade(&self) -> WeakArcmo<T>

Returns a weak reference to the contained value

Examples found in repository?
examples/arcmo_example.rs (line 41)
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
fn main() {
    println!("=== Creating Arcmo instances ===");
    // Create with Some value
    let v = Arcmo::some(42);
    println!("Created with some: v = {:?}", v);

    // Create with Default (None)
    let default: Arcmo<i32> = Arcmo::default();
    println!("Created with default: default = {:?}", default);

    // Create explicitly as None
    let none: Arcmo<i32> = Arcmo::none();
    println!("Created as none: none = {:?}", none);

    println!("\n=== Basic value operations ===");
    println!("v.value() = {:?}", v.value());
    println!("v.is_some() = {}", v.is_some());
    println!("v.is_none() = {}", v.is_none());

    println!("\n=== Modification ===");
    // Modify existing value
    v.modify(|x| *x += 1);
    println!("After v += 1: {:?}", v.value());

    v.modify(|x| *x *= 2);
    println!("After v *= 2: {:?}", v.value());

    // Try to modify None (should have no effect)
    none.modify(|x| *x = 100);
    println!("After trying to modify None: {:?}", none.value());

    println!("\n=== Multiple references ===");
    let v2 = v.clone();
    v.modify(|x| *x += 5);
    println!("Modified through v: {:?}", v.value());
    println!("Observed through v2: {:?}", v2.value());

    println!("\n=== Weak references ===");
    let weak = v.downgrade();
    println!("Weak reference: {:?}", weak);
    println!("weak.value() = {:?}", weak.value());
    println!("weak.is_some() = {}", weak.is_some());
    println!("weak.is_none() = {}", weak.is_none());

    // Modify through weak reference
    weak.modify(|x| *x += 10);
    println!("\nAfter weak modify:");
    println!("Observed through strong ref: {:?}", v.value());
    println!("Observed through weak ref: {:?}", weak.value());

    println!("\n=== Take and Replace operations ===");
    println!("Taking value from v: {:?}", v.take());
    println!("After take:");
    println!("v.is_none() = {}", v.is_none());
    println!("weak.is_none() = {}", weak.is_none());

    println!("\nReplacing with new value:");
    let previous = v.replace(100);
    println!("Previous value: {:?}", previous);
    println!("New value through v: {:?}", v.value());
    println!("New value through weak: {:?}", weak.value());

    println!("\n=== Weak reference behavior when strong ref is dropped ===");
    {
        let temp = Arcmo::some(999);
        let weak_temp = temp.downgrade();
        println!("Before drop - weak_temp.value() = {:?}", weak_temp.value());
        drop(temp);
        println!("After drop - weak_temp.value() = {:?}", weak_temp.value());
    }

    println!("\n=== Complex type example ===");
    let vec_arcmo = Arcmo::some(vec![1, 2, 3]);
    println!("Vector Arcmo: {:?}", vec_arcmo);

    vec_arcmo.modify(|v| v.push(4));
    println!("After push: {:?}", vec_arcmo.value());

    let weak_vec = vec_arcmo.downgrade();
    weak_vec.modify(|v| v.extend_from_slice(&[5, 6]));
    println!("After weak modify: {:?}", vec_arcmo.value());

    println!("\n=== Default for different types ===");
    let default_vec: Arcmo<Vec<i32>> = Arcmo::default();
    let default_string: Arcmo<String> = Arcmo::default();
    println!("Default Vec<i32>: {:?}", default_vec);
    println!("Default String: {:?}", default_string);
}

Trait Implementations§

Source§

impl<T: Clone> Clone for Arcmo<T>

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Clone + Debug> Debug for Arcmo<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: Clone + Default> Default for Arcmo<T>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T> Freeze for Arcmo<T>

§

impl<T> RefUnwindSafe for Arcmo<T>

§

impl<T> Send for Arcmo<T>
where T: Send,

§

impl<T> Sync for Arcmo<T>
where T: Send,

§

impl<T> Unpin for Arcmo<T>

§

impl<T> UnwindSafe for Arcmo<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.