1use crate::Pointee;
2
3use super::Action;
4
5pub fn return_<T>(value: T) -> Return<T> {
7 Return(value)
8}
9
10#[derive(Default, Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
12pub struct Return<T>(pub T);
13
14impl<T, X> Action<X, T> for Return<T> {
15 fn exec(self, _args: X) -> T {
16 self.0
17 }
18}
19
20pub fn return_ref<T>(value: &T) -> ReturnRef<'_, T> {
23 ReturnRef(value)
24}
25
26#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
28pub struct ReturnRef<'a, T>(pub &'a T);
29
30impl<'a, T, X> Action<X, &'a T> for ReturnRef<'a, T> {
31 fn exec(self, _args: X) -> &'a T {
32 self.0
33 }
34}
35
36pub fn return_pointee<T>(value: T) -> ReturnPointee<T> {
39 ReturnPointee(value)
40}
41
42#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
44pub struct ReturnPointee<T>(pub T);
45
46impl<P, T, X> Action<X, T> for ReturnPointee<P>
47where
48 P: Pointee<T>,
49{
50 fn exec(self, _args: X) -> T {
51 self.0.get()
52 }
53}