use crate::rstd::tracing::{rendered::*, *};
use super::*;
enum TraceCommon<'a> {
Pure,
InvolvesOneResolution,
Event(&'a str),
Wrapped { name: &'a str, trace: &'a Trace },
}
enum TraceAny<'a> {
Common(TraceCommon<'a>),
Parallel(&'a Trace, &'a Trace),
Sequential { first: &'a Trace, second: &'a Trace },
}
impl Trace {
fn any(&self) -> TraceAny<'_> {
match self {
Self::Pure => TraceAny::Common(TraceCommon::Pure),
Self::InvolvesOneResolution => TraceAny::Common(TraceCommon::InvolvesOneResolution),
Self::Event(event) => TraceAny::Common(TraceCommon::Event(event)),
Self::Wrapped { name, trace } => TraceAny::Common(TraceCommon::Wrapped {
name,
trace: &trace.trace,
}),
Self::Parallel(a, b) => TraceAny::Parallel(&a.trace, &b.trace),
Self::Sequential { first, second } => TraceAny::Sequential {
first: &first.trace,
second: &second.trace,
},
}
}
fn render(&self) -> WithLengthAndWidth<RenderedAny> {
self.any().render()
}
}
impl<A> Traced<A> {
pub fn render(&self) -> WithLengthAndWidth<RenderedAny> {
self.effect.trace.render()
}
}
fn from_sequential(
first: &Trace,
second: &Trace,
) -> WithLengthAndWidth<Vec<WithLengthAndWidth<RenderedWide>>> {
let mut vec = WithLengthAndWidth::default();
first.any().render_into_long(&mut vec);
second.any().render_into_long(&mut vec);
vec
}
fn from_parallel(
a: &Trace,
b: &Trace,
) -> WithLengthAndWidth<Vec<WithLengthAndWidth<RenderedLong>>> {
let mut vec = WithLengthAndWidth::default();
a.any().render_into_wide(&mut vec);
b.any().render_into_wide(&mut vec);
vec
}
impl<'a> TraceAny<'a> {
fn render(&'a self) -> WithLengthAndWidth<RenderedAny> {
match self {
Self::Common(common) => common.render().map(RenderedAny::Common),
Self::Parallel(a, b) => from_parallel(a, b).map(RenderedAny::Wide),
Self::Sequential { first, second } => {
from_sequential(first, second).map(RenderedAny::Long)
}
}
}
fn render_into_long(
&'a self,
vec: &mut WithLengthAndWidth<Vec<WithLengthAndWidth<RenderedWide>>>,
) {
match self {
Self::Common(common) => common.render().map(RenderedWide::Common).push_into(vec),
Self::Parallel(a, b) => from_parallel(a, b).map(RenderedWide::Wide).push_into(vec),
Self::Sequential { first, second } => {
first.any().render_into_long(vec);
second.any().render_into_long(vec);
}
}
}
fn render_into_wide(
&'a self,
vec: &mut WithLengthAndWidth<Vec<WithLengthAndWidth<RenderedLong>>>,
) {
match self {
Self::Common(common) => common.render().map(RenderedLong::Common).push_into(vec),
Self::Parallel(a, b) => {
a.any().render_into_wide(vec);
b.any().render_into_wide(vec);
}
Self::Sequential { first, second } => from_sequential(first, second)
.map(RenderedLong::Long)
.push_into(vec),
}
}
}
impl<'a> TraceCommon<'a> {
fn render(&'a self) -> WithLengthAndWidth<RenderedCommon> {
match self {
Self::Pure => RenderedCommon::empty(),
Self::InvolvesOneResolution => RenderedCommon::resolution(),
Self::Event(event) => RenderedCommon::event(event),
Self::Wrapped { name, trace } => trace.any().render().wrap(name),
}
}
}