From 13932f098c42ef26294be0279391c6741db026eb Mon Sep 17 00:00:00 2001
From: timofey <tim@ongoteam.yaconnect.com>
Date: Mon, 22 May 2023 09:50:50 +0000
Subject: [PATCH] `&str`->`String` in `Diagnostic`

---
 book-monads              |  2 +-
 src/core.rs              |  6 +++---
 src/std/tracing.rs       | 14 +++++++-------
 src/std/tracing/trace.rs |  8 ++++----
 src/testing.rs           |  6 +++---
 5 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/book-monads b/book-monads
index f1a1703..5848712 160000
--- a/book-monads
+++ b/book-monads
@@ -1 +1 @@
-Subproject commit f1a17032d247d790dc1fc38fa4e33bc53ca7370d
+Subproject commit 58487121898c8da9c51479f1df4c1055c7df1e6d
diff --git a/src/core.rs b/src/core.rs
index 47244f4..5003ff7 100644
--- a/src/core.rs
+++ b/src/core.rs
@@ -28,11 +28,11 @@ pub use self::slice_deserializer::*;
 /// Basic support for tracing events across the execution.
 pub trait Diagnostic<T: Monad> {
     /// Specify that the evaluation happens after a specific event.
-    fn after<'a, A>(fa: T::F<'a, A>, event: &'a str) -> T::F<'a, A>;
+    fn after<'a: 'b, 'b, A>(fa: T::F<'a, A>, event: impl 'b + FnOnce() -> String) -> T::F<'a, A>;
     /// Specify that the evaluation happens before a specific event.
-    fn before<'a, A>(fa: T::F<'a, A>, event: &'a str) -> T::F<'a, A>;
+    fn before<'a: 'b, 'b, A>(fa: T::F<'a, A>, event: impl 'b + FnOnce() -> String) -> T::F<'a, A>;
     /// Label the evaluation step as a specific named action.
-    fn wrapped<'a, A>(fa: T::F<'a, A>, event: &'a str) -> T::F<'a, A>;
+    fn wrapped<'a: 'b, 'b, A>(fa: T::F<'a, A>, event: impl 'b + FnOnce() -> String) -> T::F<'a, A>;
 }
 
 /// Execution context.
diff --git a/src/std/tracing.rs b/src/std/tracing.rs
index 2fd8d61..e338b47 100644
--- a/src/std/tracing.rs
+++ b/src/std/tracing.rs
@@ -52,7 +52,7 @@ impl<A> WithTrace for A {
 }
 
 impl<A> Traced<A> {
-    fn wrapped(self, event: &str) -> Self {
+    fn wrapped(self, event: String) -> Self {
         Traced {
             value: self.value,
             effect: self.effect.wrapped(event),
@@ -87,15 +87,15 @@ impl<A> Traced<A> {
 }
 
 impl Diagnostic<TracedClass> for TracedDiagnostic {
-    fn after<A>(fa: Traced<A>, event: &str) -> Traced<A> {
-        fa.after(TraceBox::event(event))
+    fn after<'a: 'b, 'b, A>(fa: Traced<A>, event: impl FnOnce() -> String) -> Traced<A> {
+        fa.after(TraceBox::event(event()))
     }
 
-    fn before<A>(fa: Traced<A>, event: &str) -> Traced<A> {
-        fa.before(TraceBox::event(event))
+    fn before<'a: 'b, 'b, A>(fa: Traced<A>, event: impl FnOnce() -> String) -> Traced<A> {
+        fa.before(TraceBox::event(event()))
     }
 
-    fn wrapped<A>(fa: Traced<A>, event: &str) -> Traced<A> {
-        fa.wrapped(event)
+    fn wrapped<'a: 'b, 'b, A>(fa: Traced<A>, event: impl FnOnce() -> String) -> Traced<A> {
+        fa.wrapped(event())
     }
 }
diff --git a/src/std/tracing/trace.rs b/src/std/tracing/trace.rs
index d7f6ead..5714295 100644
--- a/src/std/tracing/trace.rs
+++ b/src/std/tracing/trace.rs
@@ -146,13 +146,13 @@ impl TraceBox {
         Trace::InvolvesOneResolution.into()
     }
 
-    pub fn event(event: &str) -> Self {
-        Trace::Event(event.into()).into()
+    pub fn event(event: String) -> Self {
+        Trace::Event(event).into()
     }
 
-    pub fn wrapped(self, event: &str) -> Self {
+    pub fn wrapped(self, event: String) -> Self {
         Trace::Wrapped {
-            name: event.into(),
+            name: event,
             trace: self,
         }
         .into()
diff --git a/src/testing.rs b/src/testing.rs
index 9fbf72f..8ac1bdc 100644
--- a/src/testing.rs
+++ b/src/testing.rs
@@ -13,15 +13,15 @@ use crate::std::typeless::*;
 pub struct NoDiagnostic;
 
 impl<T: Monad> Diagnostic<T> for NoDiagnostic {
-    fn after<'a, A>(fa: T::F<'a, A>, _event: &'a str) -> T::F<'a, A> {
+    fn after<'a: 'b, 'b, A>(fa: T::F<'a, A>, _event: impl FnOnce() -> String) -> T::F<'a, A> {
         fa
     }
 
-    fn before<'a, A>(fa: T::F<'a, A>, _event: &'a str) -> T::F<'a, A> {
+    fn before<'a: 'b, 'b, A>(fa: T::F<'a, A>, _event: impl FnOnce() -> String) -> T::F<'a, A> {
         fa
     }
 
-    fn wrapped<'a, A>(fa: T::F<'a, A>, _event: &'a str) -> T::F<'a, A> {
+    fn wrapped<'a: 'b, 'b, A>(fa: T::F<'a, A>, _event: impl FnOnce() -> String) -> T::F<'a, A> {
         fa
     }
 }