2023-02-13 18:39:45 +01:00
|
|
|
use {
|
|
|
|
r3vi::{
|
2023-03-25 08:56:38 +01:00
|
|
|
view::{port::UpdateTask, OuterViewPort, singleton::*, sequence::*},
|
2023-02-20 03:40:37 +01:00
|
|
|
buffer::{singleton::*, vec::*}
|
2023-02-13 18:39:45 +01:00
|
|
|
},
|
|
|
|
crate::{
|
|
|
|
type_system::{Context, TypeTerm, ReprTree},
|
2023-08-11 19:23:00 +02:00
|
|
|
editors::list::{ListCursor, ListCursorMode, commander::ListCmd, PTYListController, PTYListStyle},
|
2023-03-25 08:56:38 +01:00
|
|
|
tree::{NestedNode, TreeNav, TreeCursor},
|
|
|
|
diagnostics::Diagnostics
|
2023-02-13 18:39:45 +01:00
|
|
|
},
|
2023-02-20 03:40:37 +01:00
|
|
|
std::sync::{Arc, RwLock}
|
2023-02-13 18:39:45 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
|
|
|
|
|
|
|
pub struct ListEditor {
|
|
|
|
pub(super) cursor: SingletonBuffer<ListCursor>,
|
2023-07-03 12:32:03 +02:00
|
|
|
pub data: VecBuffer< Arc<RwLock<NestedNode>> >,
|
2023-02-13 18:39:45 +01:00
|
|
|
|
|
|
|
pub(super) addr_port: OuterViewPort<dyn SequenceView<Item = isize>>,
|
|
|
|
pub(super) mode_port: OuterViewPort<dyn SingletonView<Item = ListCursorMode>>,
|
|
|
|
|
|
|
|
pub(crate) ctx: Arc<RwLock<Context>>,
|
|
|
|
|
|
|
|
/// item type
|
|
|
|
pub(super) typ: TypeTerm,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ListEditor {
|
2023-03-25 08:56:38 +01:00
|
|
|
pub fn init_ctx(ctx: &Arc<RwLock<Context>>) {
|
|
|
|
let mut ctx = ctx.write().unwrap();
|
|
|
|
|
2023-08-11 19:23:00 +02:00
|
|
|
ctx.add_list_typename("ListCmd".into());
|
|
|
|
|
2023-03-25 08:56:38 +01:00
|
|
|
ctx.add_list_typename("List".into());
|
|
|
|
ctx.add_node_ctor(
|
|
|
|
"List", Arc::new(
|
|
|
|
|ctx: Arc<RwLock<Context>>, ty: TypeTerm, depth: usize| {
|
|
|
|
match ty {
|
|
|
|
TypeTerm::Type {
|
|
|
|
id: _, args
|
|
|
|
} => {
|
|
|
|
if args.len() > 0 {
|
|
|
|
let typ = (args[0].clone().0)[0].clone();
|
2023-05-19 11:26:05 +02:00
|
|
|
|
|
|
|
let mut node = ListEditor::new(ctx.clone(), typ).into_node(depth);
|
|
|
|
|
|
|
|
PTYListController::for_node( &mut node, Some(','), Some('}') );
|
|
|
|
PTYListStyle::for_node( &mut node, ("{",", ","}") );
|
|
|
|
|
|
|
|
Some(node)
|
2023-03-25 08:56:38 +01:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_ => None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2023-02-13 18:39:45 +01:00
|
|
|
pub fn new(
|
|
|
|
ctx: Arc<RwLock<Context>>,
|
|
|
|
typ: TypeTerm,
|
|
|
|
) -> Self {
|
|
|
|
let cursor = SingletonBuffer::new(ListCursor::default());
|
2023-07-03 12:32:03 +02:00
|
|
|
let data = VecBuffer::<Arc<RwLock<NestedNode>>>::new();
|
2023-02-13 18:39:45 +01:00
|
|
|
|
|
|
|
ListEditor {
|
|
|
|
mode_port: cursor
|
|
|
|
.get_port()
|
|
|
|
.map({
|
|
|
|
let data = data.clone();
|
|
|
|
move |c| {
|
|
|
|
let ip = SingletonBuffer::new(c.mode).get_port();
|
|
|
|
match c.mode {
|
|
|
|
ListCursorMode::Insert => ip,
|
|
|
|
ListCursorMode::Select => {
|
|
|
|
if let Some(idx) = c.idx {
|
2023-07-03 12:32:03 +02:00
|
|
|
data.get(idx as usize).read().unwrap().get_mode_view()
|
2023-02-13 18:39:45 +01:00
|
|
|
} else {
|
|
|
|
ip
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.flatten(),
|
|
|
|
|
|
|
|
addr_port: VecBuffer::<OuterViewPort<dyn SequenceView<Item = isize>>>::with_data(
|
|
|
|
vec![
|
|
|
|
cursor.get_port()
|
|
|
|
.to_sequence()
|
|
|
|
.filter_map(|cur| cur.idx),
|
|
|
|
cursor.get_port()
|
|
|
|
.map({
|
|
|
|
let data = data.clone();
|
|
|
|
move |cur| {
|
|
|
|
if cur.mode == ListCursorMode::Select {
|
|
|
|
if let Some(idx) = cur.idx {
|
|
|
|
if idx >= 0 && idx < data.len() as isize {
|
2023-07-03 12:32:03 +02:00
|
|
|
return data.get(idx as usize).read().unwrap().get_addr_view();
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
OuterViewPort::default()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.to_sequence()
|
|
|
|
.flatten()
|
|
|
|
])
|
|
|
|
.get_port()
|
|
|
|
.to_sequence()
|
|
|
|
.flatten(),
|
|
|
|
cursor,
|
|
|
|
data,
|
|
|
|
ctx,
|
|
|
|
typ,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-18 04:15:47 +01:00
|
|
|
pub fn into_node(self, depth: usize) -> NestedNode {
|
|
|
|
let data = self.get_data();
|
|
|
|
let ctx = self.ctx.clone();
|
|
|
|
let editor = Arc::new(RwLock::new(self));
|
|
|
|
|
2023-03-25 08:56:38 +01:00
|
|
|
let e = editor.read().unwrap();
|
|
|
|
|
2023-02-18 04:15:47 +01:00
|
|
|
NestedNode::new(depth)
|
|
|
|
.set_ctx(ctx)
|
|
|
|
.set_data(data)
|
|
|
|
.set_editor(editor.clone())
|
|
|
|
.set_nav(editor.clone())
|
2023-08-11 19:23:00 +02:00
|
|
|
.set_cmd(editor.clone())
|
2023-03-25 08:56:38 +01:00
|
|
|
.set_diag(e
|
|
|
|
.get_data_port()
|
|
|
|
.enumerate()
|
|
|
|
.map(
|
|
|
|
|(idx, item_editor)| {
|
|
|
|
let idx = *idx;
|
|
|
|
item_editor
|
|
|
|
.get_msg_port()
|
|
|
|
.map(
|
|
|
|
move |msg| {
|
|
|
|
let mut msg = msg.clone();
|
|
|
|
msg.addr.insert(0, idx);
|
|
|
|
msg
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
.flatten()
|
|
|
|
)
|
2023-02-18 04:15:47 +01:00
|
|
|
}
|
|
|
|
|
2023-02-13 18:39:45 +01:00
|
|
|
pub fn get_item_type(&self) -> TypeTerm {
|
|
|
|
self.typ.clone()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_seq_type(&self) -> TypeTerm {
|
|
|
|
TypeTerm::Type {
|
2023-03-25 08:56:38 +01:00
|
|
|
id: self.ctx.read().unwrap().get_fun_typeid("List").unwrap(),
|
2023-03-02 03:43:38 +01:00
|
|
|
args: vec![ self.get_item_type().into() ]
|
|
|
|
}
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_cursor_port(&self) -> OuterViewPort<dyn SingletonView<Item = ListCursor>> {
|
|
|
|
self.cursor.get_port()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_data_port(&self) -> OuterViewPort<dyn SequenceView<Item = NestedNode>> {
|
2023-07-03 12:32:03 +02:00
|
|
|
self.data.get_port().to_sequence().map(
|
|
|
|
|x| x.read().unwrap().clone()
|
|
|
|
)
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_data(&self) -> Arc<RwLock<ReprTree>> {
|
|
|
|
let data_view = self.get_data_port();
|
|
|
|
ReprTree::new_leaf(
|
|
|
|
self.get_seq_type(),
|
|
|
|
data_view.into()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_item(&self) -> Option<NestedNode> {
|
|
|
|
if let Some(idx) = self.cursor.get().idx {
|
|
|
|
let idx = crate::utils::modulo(idx as isize, self.data.len() as isize) as usize;
|
|
|
|
if idx < self.data.len() {
|
2023-07-03 12:32:03 +02:00
|
|
|
Some(self.data.get(idx).read().unwrap().clone())
|
2023-02-13 18:39:45 +01:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-03 12:32:03 +02:00
|
|
|
pub fn get_item_mut(&mut self) -> Option<MutableVecAccess<Arc<RwLock<NestedNode>>>> {
|
2023-02-13 18:39:45 +01:00
|
|
|
if let Some(idx) = self.cursor.get().idx {
|
|
|
|
let idx = crate::utils::modulo(idx as isize, self.data.len() as isize) as usize;
|
|
|
|
if idx < self.data.len() {
|
|
|
|
Some(self.data.get_mut(idx))
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn is_listlist(&self) -> bool {
|
|
|
|
self.ctx.read().unwrap().is_list_type(&self.typ)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// delete all items
|
|
|
|
pub fn clear(&mut self) {
|
|
|
|
self.data.clear();
|
|
|
|
self.cursor.set(ListCursor::home());
|
|
|
|
}
|
|
|
|
|
|
|
|
/// delete item before the cursor
|
|
|
|
pub fn delete_pxev(&mut self) {
|
|
|
|
let mut cur = self.cursor.get();
|
|
|
|
if let Some(idx) = cur.idx {
|
|
|
|
if idx > 0 && idx <= self.data.len() as isize {
|
|
|
|
cur.idx = Some(idx as isize - 1);
|
|
|
|
self.cursor.set(cur);
|
|
|
|
self.data.remove(idx as usize - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// delete item after the cursor
|
|
|
|
pub fn delete_nexd(&mut self) {
|
|
|
|
if let Some(idx) = self.cursor.get().idx {
|
|
|
|
if idx < self.data.len() as isize {
|
|
|
|
self.data.remove(idx as usize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// insert a new element
|
2023-07-03 12:32:03 +02:00
|
|
|
pub fn insert(&mut self, item: Arc<RwLock<NestedNode>>) {
|
2023-02-13 18:39:45 +01:00
|
|
|
let mut cur = self.cursor.get();
|
|
|
|
if let Some(idx) = cur.idx {
|
|
|
|
match cur.mode {
|
|
|
|
ListCursorMode::Insert => {
|
|
|
|
self.data.insert(idx as usize, item.clone());
|
|
|
|
if self.is_listlist() {
|
|
|
|
cur.mode = ListCursorMode::Select;
|
|
|
|
} else {
|
2023-05-19 11:26:05 +02:00
|
|
|
cur.idx = Some(idx + 1);
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ListCursorMode::Select => {
|
|
|
|
self.data.insert(1 + idx as usize, item.clone());
|
|
|
|
if self.is_listlist() {
|
|
|
|
cur.idx = Some(idx + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
self.cursor.set(cur);
|
2023-05-19 11:26:05 +02:00
|
|
|
} else {
|
|
|
|
//eprintln!("insert: no cursor");
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
|
|
|
}
|
2023-02-20 03:40:37 +01:00
|
|
|
|
2023-02-13 18:39:45 +01:00
|
|
|
/// split the list off at the current cursor position and return the second half
|
2023-08-11 18:25:46 +02:00
|
|
|
pub fn split(&mut self, le_node: &mut NestedNode) {
|
2023-02-13 18:39:45 +01:00
|
|
|
let cur = self.cursor.get();
|
|
|
|
if let Some(idx) = cur.idx {
|
|
|
|
let idx = idx as usize;
|
2023-08-11 18:25:46 +02:00
|
|
|
le_node.goto(TreeCursor::home());
|
2023-02-13 18:39:45 +01:00
|
|
|
for _ in idx .. self.data.len() {
|
2023-08-11 18:25:46 +02:00
|
|
|
|
|
|
|
eprintln!("send items to new tail");
|
|
|
|
le_node.cmd.get().unwrap().write().unwrap().send_cmd_obj(
|
|
|
|
self.data.get(idx).read().unwrap().data.clone().unwrap()
|
|
|
|
/*
|
|
|
|
ReprTree::new_leaf(
|
|
|
|
self.ctx.read().unwrap().type_term_from_str("( NestedNode )").unwrap(),
|
|
|
|
SingletonBuffer::<NestedNode>::new( self.data.get(idx).clone().read().unwrap().clone() ).get_port().into()
|
|
|
|
)
|
|
|
|
*/
|
|
|
|
);
|
2023-02-13 18:39:45 +01:00
|
|
|
self.data.remove(idx);
|
|
|
|
}
|
2023-08-11 18:25:46 +02:00
|
|
|
le_node.goto(TreeCursor::none());
|
2023-02-20 03:40:37 +01:00
|
|
|
|
|
|
|
if self.is_listlist() {
|
2023-02-21 15:17:24 +01:00
|
|
|
if idx > 0 && idx < self.data.len()+1 {
|
2023-07-03 12:32:03 +02:00
|
|
|
|
2023-08-08 17:35:54 +02:00
|
|
|
let prev_idx = idx - 1; // get last element before cursor (we are in insert mode)
|
2023-02-20 03:40:37 +01:00
|
|
|
let prev_node = self.data.get(prev_idx);
|
2023-07-03 12:32:03 +02:00
|
|
|
let prev_node = prev_node.read().unwrap();
|
|
|
|
|
|
|
|
if let Some(prev_editor) = prev_node.editor.get() {
|
|
|
|
let prev_editor = prev_editor.downcast::<RwLock<ListEditor>>().unwrap();
|
2023-02-24 19:26:46 +01:00
|
|
|
let prev_editor = prev_editor.write().unwrap();
|
2023-03-25 08:56:38 +01:00
|
|
|
prev_editor.get_data_port().0.update();
|
2023-02-21 15:17:24 +01:00
|
|
|
|
|
|
|
if prev_editor.get_data_port().get_view().unwrap().iter()
|
|
|
|
.filter_map(|x| x.get_data_view::<dyn SingletonView<Item = Option<char>>>(vec![].into_iter())?.get()).count() == 0
|
2023-02-20 03:40:37 +01:00
|
|
|
{
|
|
|
|
drop(prev_editor);
|
|
|
|
self.data.remove(prev_idx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// append data of other editor at the end and set cursor accordingly
|
|
|
|
pub fn join(&mut self, other: &ListEditor) {
|
|
|
|
let selfcur = self.cursor.get();
|
|
|
|
let othercur = other.cursor.get();
|
|
|
|
|
|
|
|
let is_bottom = self.get_cursor().tree_addr.len() == 1 ||
|
|
|
|
other.get_cursor().tree_addr.len() == 1;
|
|
|
|
|
|
|
|
let is_insert =
|
|
|
|
selfcur.mode == ListCursorMode::Insert
|
|
|
|
|| othercur.mode == ListCursorMode::Insert;
|
|
|
|
|
|
|
|
let is_primary = self.get_cursor().tree_addr.len() > 1;
|
|
|
|
|
|
|
|
self.cursor.set(ListCursor {
|
|
|
|
mode: if is_insert && is_bottom {
|
|
|
|
ListCursorMode::Insert
|
|
|
|
} else {
|
|
|
|
ListCursorMode::Select
|
|
|
|
},
|
|
|
|
idx: Some(self.data.len() as isize -
|
|
|
|
if is_primary {
|
|
|
|
1
|
|
|
|
} else {
|
|
|
|
0
|
|
|
|
}
|
|
|
|
)
|
|
|
|
});
|
|
|
|
|
|
|
|
for i in 0 .. other.data.len() {
|
|
|
|
self.data.push(other.data.get(i));
|
|
|
|
}
|
|
|
|
}
|
2023-03-25 08:56:38 +01:00
|
|
|
|
|
|
|
pub fn listlist_split(&mut self) {
|
|
|
|
let cur = self.get_cursor();
|
|
|
|
|
2023-07-03 12:32:03 +02:00
|
|
|
if let Some(item) = self.get_item() {
|
|
|
|
// let item = item.read().unwrap();
|
|
|
|
let depth = item.depth;
|
2023-08-11 18:25:46 +02:00
|
|
|
|
2023-07-03 12:32:03 +02:00
|
|
|
if let Some(head_editor) = item.editor.get() {
|
2023-08-11 18:25:46 +02:00
|
|
|
|
2023-07-03 12:32:03 +02:00
|
|
|
let head = head_editor.downcast::<RwLock<ListEditor>>().unwrap();
|
2023-03-25 08:56:38 +01:00
|
|
|
let mut head = head.write().unwrap();
|
2023-08-11 18:25:46 +02:00
|
|
|
|
2023-03-25 08:56:38 +01:00
|
|
|
if head.data.len() > 0 {
|
|
|
|
if cur.tree_addr.len() > 2 {
|
2023-08-11 18:25:46 +02:00
|
|
|
eprintln!("call child head listlist split");
|
2023-03-25 08:56:38 +01:00
|
|
|
head.listlist_split();
|
2023-08-11 18:25:46 +02:00
|
|
|
eprintln!("return");
|
2023-03-25 08:56:38 +01:00
|
|
|
}
|
|
|
|
|
2023-08-11 18:25:46 +02:00
|
|
|
eprintln!("got head");
|
|
|
|
|
|
|
|
let mut tail_node = Context::make_node(&self.ctx, self.typ.clone(), 0).unwrap();
|
|
|
|
head.split( &mut tail_node );
|
|
|
|
|
|
|
|
eprintln!("made split");
|
2023-03-25 08:56:38 +01:00
|
|
|
|
|
|
|
head.goto(TreeCursor::none());
|
2023-08-11 18:25:46 +02:00
|
|
|
drop(head);
|
|
|
|
|
|
|
|
eprintln!("done goto");
|
2023-03-25 08:56:38 +01:00
|
|
|
|
2023-08-11 18:25:46 +02:00
|
|
|
tail_node.goto(
|
|
|
|
TreeCursor {
|
|
|
|
tree_addr: vec![0],
|
|
|
|
leaf_mode: if cur.tree_addr.len() > 2 {
|
2023-03-25 08:56:38 +01:00
|
|
|
ListCursorMode::Select
|
|
|
|
} else {
|
|
|
|
ListCursorMode::Insert
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
self.insert(
|
2023-07-03 12:32:03 +02:00
|
|
|
Arc::new(RwLock::new(tail_node))
|
2023-03-25 08:56:38 +01:00
|
|
|
);
|
2023-08-11 18:25:46 +02:00
|
|
|
|
|
|
|
eprintln!("made insert");
|
2023-03-25 08:56:38 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn listlist_join_pxev(&mut self, idx: isize, item: &NestedNode) {
|
|
|
|
{
|
|
|
|
let prev_editor = self.data.get_mut(idx as usize-1);
|
2023-07-03 12:32:03 +02:00
|
|
|
let prev_editor = prev_editor.read().unwrap();
|
|
|
|
|
|
|
|
if let Some(prev_editor) = prev_editor.editor.get() {
|
|
|
|
if let Ok(prev_editor) = prev_editor.downcast::<RwLock<ListEditor>>() {
|
2023-03-25 08:56:38 +01:00
|
|
|
let mut prev_editor = prev_editor.write().unwrap();
|
|
|
|
|
2023-07-03 12:32:03 +02:00
|
|
|
let cur_editor = item.editor.get().unwrap();
|
|
|
|
let cur_editor = cur_editor.downcast::<RwLock<ListEditor>>().unwrap();
|
2023-03-25 08:56:38 +01:00
|
|
|
let cur_editor = cur_editor.write().unwrap();
|
|
|
|
|
|
|
|
prev_editor.join(&cur_editor);
|
2023-08-08 17:35:54 +02:00
|
|
|
|
2023-03-25 08:56:38 +01:00
|
|
|
self.cursor.set(
|
|
|
|
ListCursor {
|
|
|
|
idx: Some(idx - 1), mode: ListCursorMode::Select
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
self.data.remove(idx as usize);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn listlist_join_nexd(&mut self, next_idx: usize, item: &NestedNode) {
|
|
|
|
{
|
2023-07-03 12:32:03 +02:00
|
|
|
let next_editor = self.data.get(next_idx);
|
|
|
|
let next_editor = next_editor.read().unwrap();
|
|
|
|
if let Some(next_editor) = next_editor.editor.get() {
|
|
|
|
if let Ok(next_editor) = next_editor.downcast::<RwLock<ListEditor>>() {
|
2023-03-25 08:56:38 +01:00
|
|
|
let mut next_editor = next_editor.write().unwrap();
|
2023-07-03 12:32:03 +02:00
|
|
|
let cur_editor = item.editor.get().unwrap();
|
|
|
|
let cur_editor = cur_editor.downcast::<RwLock<ListEditor>>().unwrap();
|
2023-03-25 08:56:38 +01:00
|
|
|
let mut cur_editor = cur_editor.write().unwrap();
|
|
|
|
|
|
|
|
cur_editor.join(&next_editor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.data.remove(next_idx);
|
|
|
|
}
|
2023-02-13 18:39:45 +01:00
|
|
|
}
|
2023-02-17 00:59:07 +01:00
|
|
|
/*
|
|
|
|
use crate::{
|
|
|
|
type_system::TypeLadder,
|
|
|
|
tree::{TreeType, TreeAddr}
|
|
|
|
};
|
|
|
|
|
|
|
|
impl TreeType for ListEditor {
|
|
|
|
fn get_type(&self, addr: &TreeAddr) -> TypeLadder {
|
|
|
|
let idx = crate::utils::modulo::modulo(addr.0[0] as isize, self.data.len() as isize) as usize;
|
2023-02-13 18:39:45 +01:00
|
|
|
|
2023-02-17 00:59:07 +01:00
|
|
|
let mut addr = addr.clone();
|
|
|
|
|
|
|
|
if self.data.len() > 0 {
|
|
|
|
addr.0.remove(0);
|
|
|
|
self.data.get(idx).get_type(addr)
|
|
|
|
} else {
|
|
|
|
vec![]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|