terrazzo-terminal 0.2.7

A simple web-based terminal emulator built on Terrazzo.
#![cfg(feature = "client")]

use std::marker::PhantomData;

use terrazzo::prelude::XSignal;

use super::api::Direction;
use super::id::TileId;
use super::signals::TilePtr as UiTilePtr;
use super::signals::Tiles as UiTileTree;

pub trait TilesVisitorKind: Sized {
    type Node;
    type Tile;
    type Direction;

    fn do_visit_node<V: TilesTreeVisitor<Self> + ?Sized>(visitor: &mut V, tree: Self::Node);
}

pub trait TilesTreeVisitor<K: TilesVisitorKind> {
    fn visit_node(&mut self, node: K::Node) {
        K::do_visit_node(self, node);
    }
    fn visit_tree(
        &mut self,
        #[expect(unused)] id: TileId,
        #[expect(unused)] direction: K::Direction,
    ) {
    }
    fn visit_tile(&mut self, #[expect(unused)] tile: K::Tile) {}
}

pub struct UiStateVisitor<'l> {
    _phantom: PhantomData<&'l ()>,
}

impl<'l> TilesVisitorKind for UiStateVisitor<'l> {
    type Node = &'l UiTileTree;
    type Tile = &'l UiTilePtr;
    type Direction = &'l XSignal<Direction>;

    fn do_visit_node<V: TilesTreeVisitor<Self> + ?Sized>(visitor: &mut V, tree: Self::Node) {
        match tree {
            UiTileTree::Tile(tile) => visitor.visit_tile(tile),
            UiTileTree::Array {
                id,
                direction,
                nodes,
            } => {
                visitor.visit_tree(*id, direction);
                for node in nodes {
                    visitor.visit_node(node);
                }
            }
        }
    }
}