#![recursion_limit = "1024"]
#![allow(unused)]
use tcrts::all::*;
type _0 = Zero;
type _1 = Next<_0>;
type _2 = Next<_1>;
type _3 = Next<_2>;
type _4 = Next<_3>;
type _5 = Next<_4>;
type _6 = Next<_5>;
type _7 = Next<_6>;
type _8 = Next<_7>;
type _9 = Next<_8>;
type _50 = macros::apply!(Next, Zero, 50);
struct Shl;
struct Shr;
struct Inc;
struct Dec;
struct LoopStart;
struct LoopEnd;
trait Instr {}
impl Instr for Shl {}
impl Instr for Shr {}
impl Instr for Inc {}
impl Instr for Dec {}
impl Instr for LoopStart {}
impl Instr for LoopEnd {}
type Cells = macros::list![_0, _0, _0, _0, _0, _0, _0, _0, _0, _0, _0];
trait Interpret<Ptr, DataArray, Loop> {
type DataArray;
}
impl<Ptr: Num, DataArray, Loop> Interpret<Ptr, DataArray, Loop> for Nil {
type DataArray = DataArray;
}
impl<NextInstrs, Ptr, DataArray, Loop> Interpret<Ptr, DataArray, Loop> for Cons<Inc, NextInstrs>
where
Ptr: Num,
DataArray: GetIndex<Ptr> + GetIndex<_0> + Replace<Ptr, Next<tcrts::index!(DataArray, Ptr)>>,
NextInstrs:
Interpret<Ptr, tcrts::replace!(DataArray, Ptr, Next<tcrts::index!(DataArray, Ptr)>), Loop>,
{
type DataArray = <NextInstrs as Interpret<
Ptr,
tcrts::replace!(DataArray, Ptr, Next<tcrts::index!(DataArray, Ptr)>),
Loop,
>>::DataArray;
}
impl<NextInstrs, Ptr, DataArray, Loop> Interpret<Ptr, DataArray, Loop> for Cons<Dec, NextInstrs>
where
Ptr: Num,
DataArray: GetIndex<Ptr> + Replace<Ptr, tcrts::subtract!(tcrts::index!(DataArray, Ptr), _1)>,
<DataArray as GetIndex<Ptr>>::Output: PeanoSub<_1>,
NextInstrs: Interpret<
Ptr, tcrts::replace!(
DataArray,
Ptr,
tcrts::subtract!(tcrts::index!(DataArray, Ptr), _1)
), Loop,
>,
{
type DataArray = <NextInstrs as Interpret<
Ptr,
tcrts::replace!(
DataArray,
Ptr,
tcrts::subtract!(tcrts::index!(DataArray, Ptr), _1)
),
Loop,
>>::DataArray;
}
impl<NextInstrs, Ptr, DataArray, Loop> Interpret<Ptr, DataArray, Loop> for Cons<Shr, NextInstrs>
where
Ptr: Num,
NextInstrs: Interpret<Next<Ptr>, DataArray, Loop>,
{
type DataArray = <NextInstrs as Interpret<Next<Ptr>, DataArray, Loop>>::DataArray;
}
impl<NextInstrs, Ptr, DataArray, Loop> Interpret<Ptr, DataArray, Loop> for Cons<Shl, NextInstrs>
where
Ptr: Num + PeanoSub<_1>,
NextInstrs: Interpret<tcrts::subtract!(Ptr, _1), DataArray, Loop>,
{
type DataArray =
<NextInstrs as Interpret<tcrts::subtract!(Ptr, _1), DataArray, Loop>>::DataArray;
}
impl<NextInstrs, Ptr, DataArray, Loop> Interpret<Ptr, DataArray, Loop>
for Cons<LoopStart, NextInstrs>
where
NextInstrs: Interpret<Ptr, DataArray, Pair<NextInstrs, Ptr>>,
{
type DataArray = <NextInstrs as Interpret<Ptr, DataArray, Pair<NextInstrs, Ptr>>>::DataArray;
}
impl<NextInstrs, Ptr, DataArray, Loop> Interpret<Ptr, DataArray, Loop> for Cons<LoopEnd, NextInstrs>
where
NextInstrs: Interpret<Ptr, DataArray, Nil>,
Loop: Right + Left,
DataArray: GetIndex<<Loop as Right>::Output>,
<DataArray as GetIndex<<Loop as Right>::Output>>::Output: PeanoEq<Zero>,
<<DataArray as GetIndex<<Loop as Right>::Output>>::Output as PeanoEq<Zero>>::Output:
Conditional<
<NextInstrs as Interpret<Ptr, DataArray, Nil>>::DataArray,
<<Loop as Left>::Output as Interpret<Ptr, DataArray, Loop>>::DataArray,
>,
<Loop as Left>::Output: Interpret<Ptr, DataArray, Loop>,
{
type DataArray = tcrts::condition! {
tcrts::eq!(tcrts::index!(DataArray, <Loop as Right>::Output), Zero)
=> <
NextInstrs as
Interpret<Ptr, DataArray, Nil>
>::DataArray
| <<Loop as Left>::Output as Interpret<Ptr, DataArray, Loop>>::DataArray
};
}
pub fn main() {
#[rustfmt::skip]
type InstructionSet = macros::list![
];
println!(
"Output: {:?}",
macros::list_to_array!(
<InstructionSet as Interpret<Zero, Cells, Nil>>::DataArray,
0..11
)
);
}