use super::{Mutable, ObjectMarkerFor, PreformattedContext, Problem, ProblemConversion, ProblemOwnershipMarker};
use std::{fmt, iter::*};
pub trait UnsizedProblemExtension<ContextT, OwnershipT, ThreadSafetyT>
where
ContextT: 'static + ?Sized,
OwnershipT: 'static,
ThreadSafetyT: 'static,
{
fn in_context<ParentContextT>(self, context: ParentContextT) -> Problem<ParentContextT, Mutable, ThreadSafetyT>
where
ParentContextT: fmt::Display + fmt::Debug + ObjectMarkerFor<ThreadSafetyT>;
fn convert_into<NewContextT>(self) -> Problem<NewContextT, Mutable, ThreadSafetyT>
where
NewContextT: ProblemConversion<ContextT, OwnershipT, ThreadSafetyT>;
fn has_context<FindContextT>(&self) -> bool
where
OwnershipT: ProblemOwnershipMarker,
FindContextT: 'static;
}
impl<ContextT, OwnershipT, ThreadSafetyT> UnsizedProblemExtension<ContextT, OwnershipT, ThreadSafetyT>
for Problem<ContextT, OwnershipT, ThreadSafetyT>
where
ContextT: ?Sized,
{
fn in_context<ParentContextT>(self, context: ParentContextT) -> Problem<ParentContextT, Mutable, ThreadSafetyT>
where
ParentContextT: fmt::Display + fmt::Debug + ObjectMarkerFor<ThreadSafetyT>,
{
self.context(context)
}
fn convert_into<NewContextT>(self) -> Problem<NewContextT, Mutable, ThreadSafetyT>
where
NewContextT: ProblemConversion<ContextT, OwnershipT, ThreadSafetyT>,
{
self.context_to()
}
fn has_context<FindContextT>(&self) -> bool
where
OwnershipT: ProblemOwnershipMarker,
FindContextT: 'static,
{
self.iter_reports().filter_map(|report| report.downcast_current_context::<FindContextT>()).next().is_some()
}
}
pub trait SizedProblemExtension<ContextT, ThreadSafetyT>
where
ContextT: Sized,
{
fn replace_context<F, NewContextT>(self, f: F) -> Problem<NewContextT, Mutable, ThreadSafetyT>
where
F: FnOnce(ContextT) -> NewContextT,
NewContextT: fmt::Display + fmt::Debug + ObjectMarkerFor<ThreadSafetyT>;
fn replace_and_preserve_context<F, NewContextT>(self, f: F) -> Problem<NewContextT, Mutable, ThreadSafetyT>
where
F: FnOnce(ContextT) -> NewContextT,
NewContextT: fmt::Display + fmt::Debug + ObjectMarkerFor<ThreadSafetyT>,
PreformattedContext: ObjectMarkerFor<ThreadSafetyT>;
}
impl<ContextT, ThreadSafetyT> SizedProblemExtension<ContextT, ThreadSafetyT>
for Problem<ContextT, Mutable, ThreadSafetyT>
where
ContextT: Sized,
{
fn replace_context<F, NewContextT>(self, f: F) -> Problem<NewContextT, Mutable, ThreadSafetyT>
where
F: FnOnce(ContextT) -> NewContextT,
NewContextT: fmt::Display + fmt::Debug + ObjectMarkerFor<ThreadSafetyT>,
{
self.context_transform(f)
}
fn replace_and_preserve_context<F, NewContextT>(self, f: F) -> Problem<NewContextT, Mutable, ThreadSafetyT>
where
F: FnOnce(ContextT) -> NewContextT,
NewContextT: fmt::Display + fmt::Debug + ObjectMarkerFor<ThreadSafetyT>,
PreformattedContext: ObjectMarkerFor<ThreadSafetyT>,
{
self.context_transform_nested(f)
}
}