wip
This commit is contained in:
parent
0bcfd7a65a
commit
10cbeb52a3
16 changed files with 675 additions and 59 deletions
|
@ -10,5 +10,7 @@ members = [
|
||||||
"examples/tty-02-digit",
|
"examples/tty-02-digit",
|
||||||
"examples/tty-03-string",
|
"examples/tty-03-string",
|
||||||
"examples/tty-04-posint",
|
"examples/tty-04-posint",
|
||||||
|
"examples/tty-05-dictionary",
|
||||||
|
"examples/tty-06-color"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -67,12 +67,26 @@ async fn main() {
|
||||||
&rt_int,
|
&rt_int,
|
||||||
&nested::repr_tree::morphism::MorphismType {
|
&nested::repr_tree::morphism::MorphismType {
|
||||||
src_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq <Digit 16>> ~ <List <Digit 16> ~ Char> ~ <Vec Char>"),
|
src_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq <Digit 16>> ~ <List <Digit 16> ~ Char> ~ <Vec Char>"),
|
||||||
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq <Digit 16>> ~ <List <Digit 16> ~ Char> ~ EditTree")
|
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq <Digit 16>> ~ <List <Digit 16>> ~ EditTree")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
/* set Hex-editor to be master
|
/* set Hex-editor to be master
|
||||||
*/
|
*/
|
||||||
rt_int.write().unwrap().detach( &ctx );
|
rt_int.write().unwrap().detach( &ctx );
|
||||||
|
|
||||||
|
ctx.read().unwrap().apply_morphism(
|
||||||
|
&rt_int,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq <Digit 16>> ~ <List <Digit 16> ~ Char> ~ EditTree"),
|
||||||
|
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq <Digit 16>> ~ <List <Digit 16> ~ EditTree >")
|
||||||
|
// dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 10 BigEndian> ~ <Seq <Digit 10>> ~ <List <Digit 10> ~ Char> ~ EditTree")
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
/*
|
||||||
ctx.read().unwrap().apply_morphism(
|
ctx.read().unwrap().apply_morphism(
|
||||||
&rt_int,
|
&rt_int,
|
||||||
&laddertypes::MorphismType {
|
&laddertypes::MorphismType {
|
||||||
|
@ -80,15 +94,15 @@ async fn main() {
|
||||||
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 10 BigEndian> ~ <Seq <Digit 10>> ~ <List <Digit 10> ~ Char> ~ EditTree")
|
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 10 BigEndian> ~ <Seq <Digit 10>> ~ <List <Digit 10> ~ Char> ~ EditTree")
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
let edittree_hex_be_list =
|
let edittree_hex_be_list =
|
||||||
rt_int
|
rt_int
|
||||||
.descend(Context::parse(&ctx, "
|
.descend(Context::parse(&ctx, "
|
||||||
<PosInt 16 BigEndian>
|
<PosInt 16 BigEndian>
|
||||||
~ <Seq~List <Digit 16>~Char>
|
~ <Seq~List <Digit 16>>
|
||||||
")).unwrap()
|
")).unwrap()
|
||||||
.edittree( &ctx );
|
.edittree( &ctx );
|
||||||
|
/*
|
||||||
let edittree_dec_be_list =
|
let edittree_dec_be_list =
|
||||||
rt_int
|
rt_int
|
||||||
.descend(Context::parse(&ctx, "
|
.descend(Context::parse(&ctx, "
|
||||||
|
@ -120,19 +134,19 @@ async fn main() {
|
||||||
.map(|v| TerminalAtom::from(char::from_digit(*v as u32, 10)))
|
.map(|v| TerminalAtom::from(char::from_digit(*v as u32, 10)))
|
||||||
.to_sequence()
|
.to_sequence()
|
||||||
.to_grid_horizontal();
|
.to_grid_horizontal();
|
||||||
|
*/
|
||||||
/* list of both editors
|
/* list of both editors
|
||||||
*/
|
*/
|
||||||
let mut list_editor = nested::editors::list::ListEditor::new(ctx.clone(), Context::parse(&ctx, "<Seq Char>"));
|
let mut list_editor = nested::editors::list::ListEditor::new(ctx.clone(), Context::parse(&ctx, "<Seq Char>"));
|
||||||
list_editor.data.push( edittree_hex_be_list.get() );
|
list_editor.data.push( edittree_hex_be_list.get() );
|
||||||
list_editor.data.push( edittree_dec_be_list.get() );
|
//list_editor.data.push( edittree_dec_be_list.get() );
|
||||||
let mut edittree = list_editor.into_node(SingletonBuffer::new(0).get_port());
|
let mut edittree = list_editor.into_node(SingletonBuffer::new(0).get_port());
|
||||||
|
|
||||||
/* cursors are a bit screwed initially so fix them up
|
/* cursors are a bit screwed initially so fix them up
|
||||||
* TODO: how to fix this generally?
|
* TODO: how to fix this generally?
|
||||||
*/
|
*/
|
||||||
edittree_hex_be_list.get().write().unwrap().goto(TreeCursor::none());
|
edittree_hex_be_list.get().write().unwrap().goto(TreeCursor::none());
|
||||||
edittree_dec_be_list.get().write().unwrap().goto(TreeCursor::none());
|
//edittree_dec_be_list.get().write().unwrap().goto(TreeCursor::none());
|
||||||
edittree.goto(TreeCursor{
|
edittree.goto(TreeCursor{
|
||||||
leaf_mode: nested::editors::list::ListCursorMode::Insert,
|
leaf_mode: nested::editors::list::ListCursorMode::Insert,
|
||||||
tree_addr: vec![0,0]
|
tree_addr: vec![0,0]
|
||||||
|
@ -210,10 +224,11 @@ async fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
show_edit_tree(&ctx, &mut comp, &rt_int.descend(Context::parse(&ctx, "<PosInt 16 BigEndian> ~ <Seq~List <Digit 16>~Char>")).expect(""), 1);
|
show_edit_tree(&ctx, &mut comp, &rt_int.descend(Context::parse(&ctx, "<PosInt 16 BigEndian> ~ <Seq~List <Digit 16>~Char>")).expect(""), 1);
|
||||||
show_edit_tree(&ctx, &mut comp, &rt_int.descend(Context::parse(&ctx, "<PosInt 10 BigEndian> ~ <Seq~List <Digit 10>~Char>")).expect(""), 4);
|
//show_edit_tree(&ctx, &mut comp, &rt_int.descend(Context::parse(&ctx, "<PosInt 10 BigEndian> ~ <Seq~List <Digit 10>~Char>")).expect(""), 4);
|
||||||
|
|
||||||
/* project the seq of u64 representations to a view
|
/* project the seq of u64 representations to a view
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
comp.push(nested_tty::make_label("dec: ").offset(Vector2::new(3,7)));
|
comp.push(nested_tty::make_label("dec: ").offset(Vector2::new(3,7)));
|
||||||
comp.push(dec_digits_view.offset(Vector2::new(8,7)).map_item(|_,a| {
|
comp.push(dec_digits_view.offset(Vector2::new(8,7)).map_item(|_,a| {
|
||||||
a.add_style_back(TerminalStyle::fg_color((30,90,200)))
|
a.add_style_back(TerminalStyle::fg_color((30,90,200)))
|
||||||
|
@ -223,6 +238,7 @@ async fn main() {
|
||||||
comp.push(hex_digits_view.offset(Vector2::new(8,8)).map_item(|_,a| {
|
comp.push(hex_digits_view.offset(Vector2::new(8,8)).map_item(|_,a| {
|
||||||
a.add_style_back(TerminalStyle::fg_color((200, 200, 30)))
|
a.add_style_back(TerminalStyle::fg_color((200, 200, 30)))
|
||||||
}));
|
}));
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write the changes in the view of `term_port` to the terminal
|
/* write the changes in the view of `term_port` to the terminal
|
||||||
|
|
19
examples/tty-05-dictionary/Cargo.toml
Normal file
19
examples/tty-05-dictionary/Cargo.toml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[package]
|
||||||
|
name = "tty-05-dictionary"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
laddertypes = { path = "../../../lib-laddertypes" }
|
||||||
|
r3vi = { path = "../../../lib-r3vi" }
|
||||||
|
nested = { path = "../../lib-nested-core" }
|
||||||
|
nested-tty = { path = "../../lib-nested-tty" }
|
||||||
|
termion = "*"
|
||||||
|
cgmath = "*"
|
||||||
|
|
||||||
|
[dependencies.async-std]
|
||||||
|
version = "1.9.0"
|
||||||
|
features = ["unstable", "attributes"]
|
||||||
|
|
175
examples/tty-05-dictionary/src/main.rs
Normal file
175
examples/tty-05-dictionary/src/main.rs
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
extern crate cgmath;
|
||||||
|
extern crate nested;
|
||||||
|
extern crate nested_tty;
|
||||||
|
extern crate r3vi;
|
||||||
|
extern crate termion;
|
||||||
|
|
||||||
|
use {
|
||||||
|
cgmath::Vector2,
|
||||||
|
nested::{
|
||||||
|
editors::{
|
||||||
|
ObjCommander
|
||||||
|
},
|
||||||
|
repr_tree::{Context, ReprTree, ReprTreeExt, ReprLeaf},
|
||||||
|
edit_tree::{EditTree, TreeNav, TreeCursor}
|
||||||
|
},
|
||||||
|
nested_tty::{
|
||||||
|
DisplaySegment, TTYApplication,
|
||||||
|
TerminalCompositor, TerminalStyle, TerminalView,
|
||||||
|
TerminalAtom, TerminalEvent
|
||||||
|
},
|
||||||
|
r3vi::{
|
||||||
|
buffer::{singleton::*, vec::*},
|
||||||
|
view::{port::UpdateTask, singleton::*, list::*, sequence::*},
|
||||||
|
projection::*
|
||||||
|
},
|
||||||
|
std::sync::{Arc, RwLock},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
|
||||||
|
/* setup context
|
||||||
|
*/
|
||||||
|
let ctx = Arc::new(RwLock::new(Context::new()));
|
||||||
|
nested::editors::char::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::digit::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::integer::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::list::init_ctx( ctx.clone() );
|
||||||
|
nested_tty::setup_edittree_hook(&ctx);
|
||||||
|
|
||||||
|
let dict = Arc::new(RwLock::new(std::collections::HashMap::<String, u64>::new()));
|
||||||
|
|
||||||
|
dict.write().unwrap().insert( "red".into(), 0 );
|
||||||
|
dict.write().unwrap().insert( "green".into(), 1 );
|
||||||
|
dict.write().unwrap().insert( "blue".into(), 2 );
|
||||||
|
|
||||||
|
let symbol_morph_str_to_u64 = nested::repr_tree::GenericReprTreeMorphism::new(
|
||||||
|
Context::parse(&ctx, "Symbol ~ <Seq~List~Vec Char>"),
|
||||||
|
Context::parse(&ctx, "Symbol ~ ℕ ~ machine.UInt64"),
|
||||||
|
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
let dict = dict.clone();
|
||||||
|
|
||||||
|
move |rt, σ| {
|
||||||
|
let str_view = rt
|
||||||
|
.descend(Context::parse(&ctx, "Symbol ~ <Seq~List~Vec Char>")).unwrap()
|
||||||
|
.vec_buffer::<char>()
|
||||||
|
.get_port();
|
||||||
|
|
||||||
|
let u64_view = str_view
|
||||||
|
.to_singleton()
|
||||||
|
.map({
|
||||||
|
let dict = dict.clone();
|
||||||
|
let old_value = Arc::new(RwLock::new(0));
|
||||||
|
move |chars| {
|
||||||
|
let str_val = chars.iter().collect::<String>();
|
||||||
|
let dict = dict.read().unwrap();
|
||||||
|
|
||||||
|
let mut old_value = old_value.write().unwrap();
|
||||||
|
if let Some( new_value ) = dict.get( &str_val ) {
|
||||||
|
*old_value = new_value.clone();
|
||||||
|
new_value.clone()
|
||||||
|
} else {
|
||||||
|
old_value.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
rt.attach_leaf_to(
|
||||||
|
Context::parse(&ctx, "ℕ ~ machine.UInt64"),
|
||||||
|
u64_view
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
ctx.write().unwrap().morphisms.add_morphism( symbol_morph_str_to_u64 );
|
||||||
|
|
||||||
|
let mut symbol_rt = nested::repr_tree::ReprTree::from_str(Context::parse(&ctx, "
|
||||||
|
Symbol ~ <Seq~List~Vec Char>
|
||||||
|
"),
|
||||||
|
"red"
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// this is required to initialize the <Vec EditTree> representation,
|
||||||
|
// and to take the value from <Vec Char>
|
||||||
|
ctx.read().unwrap().apply_morphism( &symbol_rt,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "Symbol ~ <Seq~List~Vec Char>"),
|
||||||
|
dst_type: Context::parse(&ctx, "Symbol ~ <Seq~List Char> ~ EditTree")
|
||||||
|
});
|
||||||
|
symbol_rt.write().unwrap().detach( &ctx );
|
||||||
|
|
||||||
|
ctx.read().unwrap().apply_morphism( &symbol_rt,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
dst_type: Context::parse(&ctx, "Symbol ~ <Seq~List~Vec Char>"),
|
||||||
|
src_type: Context::parse(&ctx, "Symbol ~ <Seq~List Char> ~ EditTree")
|
||||||
|
});
|
||||||
|
ctx.read().unwrap().apply_morphism( &symbol_rt,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "Symbol ~ <Seq~List~Vec Char>"),
|
||||||
|
dst_type: Context::parse(&ctx, "Symbol ~ ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10>~Char> ~ EditTree")
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
let symbol1_str_edit = symbol_rt.descend(Context::parse(&ctx, "
|
||||||
|
Symbol ~ <Seq~List Char>
|
||||||
|
")).unwrap().edittree( &ctx );
|
||||||
|
|
||||||
|
let symbol1_nat_edit = symbol_rt.descend(Context::parse(&ctx, "
|
||||||
|
Symbol ~ ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10>~Char>
|
||||||
|
")).unwrap().edittree( &ctx );
|
||||||
|
|
||||||
|
symbol1_nat_edit.get().write().unwrap().goto(TreeCursor::none());
|
||||||
|
|
||||||
|
/* setup terminal
|
||||||
|
*/
|
||||||
|
let app = TTYApplication::new({
|
||||||
|
/* event handler
|
||||||
|
*/
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
let edit = symbol1_str_edit.get().clone();
|
||||||
|
|
||||||
|
edit.write().unwrap().goto(TreeCursor::home());
|
||||||
|
|
||||||
|
move |ev| {
|
||||||
|
edit.write().unwrap().send_cmd_obj( ev.to_repr_tree(&ctx) );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Setup the compositor to serve as root-view
|
||||||
|
* by routing it to the `app.port` Viewport,
|
||||||
|
* so it will be displayed on TTY-output.
|
||||||
|
*/
|
||||||
|
let compositor = TerminalCompositor::new(app.port.inner());
|
||||||
|
|
||||||
|
/* Now add some views to our compositor
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
let mut comp = compositor.write().unwrap();
|
||||||
|
|
||||||
|
fn show_edit_tree( ctx: &Arc<RwLock<Context>>, comp: &mut TerminalCompositor, rt: &Arc<RwLock<ReprTree>>, y: i16 )
|
||||||
|
{
|
||||||
|
let rt_edittree = rt.descend(Context::parse(&ctx, "EditTree")).expect("descend");
|
||||||
|
let halo_type = rt_edittree.read().unwrap().get_halo_type().clone();
|
||||||
|
let edittree = rt_edittree.read().unwrap().get_view::<dyn r3vi::view::singleton::SingletonView<Item = Arc<RwLock<EditTree>>>>().unwrap().get().read().unwrap().clone();
|
||||||
|
|
||||||
|
comp.push( nested_tty::make_label( &ctx.read().unwrap().type_term_to_str(&halo_type) )
|
||||||
|
.map_item(|_pt, atom| atom.add_style_front(TerminalStyle::fg_color((90,90,90))))
|
||||||
|
.offset(Vector2::new(1,y)));
|
||||||
|
|
||||||
|
comp.push( edittree.display_view()
|
||||||
|
.offset(Vector2::new(1,y+1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
show_edit_tree( &ctx, &mut comp, &symbol_rt.descend(Context::parse(&ctx, "Symbol ~ <Seq~List Char>")).unwrap(), 1 );
|
||||||
|
show_edit_tree( &ctx, &mut comp, &symbol_rt.descend(Context::parse(&ctx, "Symbol ~ ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10>~Char>")).unwrap(), 3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write the changes in the view of `term_port` to the terminal
|
||||||
|
*/
|
||||||
|
app.show().await.expect("output error!");
|
||||||
|
}
|
||||||
|
|
19
examples/tty-06-color/Cargo.toml
Normal file
19
examples/tty-06-color/Cargo.toml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[package]
|
||||||
|
name = "tty-06-color"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
laddertypes = { path = "../../../lib-laddertypes" }
|
||||||
|
r3vi = { path = "../../../lib-r3vi" }
|
||||||
|
nested = { path = "../../lib-nested-core" }
|
||||||
|
nested-tty = { path = "../../lib-nested-tty" }
|
||||||
|
termion = "*"
|
||||||
|
cgmath = "*"
|
||||||
|
|
||||||
|
[dependencies.async-std]
|
||||||
|
version = "1.9.0"
|
||||||
|
features = ["unstable", "attributes"]
|
||||||
|
|
232
examples/tty-06-color/src/main.rs
Normal file
232
examples/tty-06-color/src/main.rs
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
extern crate cgmath;
|
||||||
|
extern crate nested;
|
||||||
|
extern crate nested_tty;
|
||||||
|
extern crate r3vi;
|
||||||
|
extern crate termion;
|
||||||
|
|
||||||
|
use {
|
||||||
|
cgmath::Vector2,
|
||||||
|
nested::{
|
||||||
|
editors::{
|
||||||
|
ObjCommander
|
||||||
|
},
|
||||||
|
repr_tree::{Context, ReprTree, ReprTreeExt, ReprLeaf},
|
||||||
|
edit_tree::{EditTree, TreeNav, TreeCursor}
|
||||||
|
},
|
||||||
|
nested_tty::{
|
||||||
|
DisplaySegment, TTYApplication,
|
||||||
|
TerminalCompositor, TerminalStyle, TerminalView,
|
||||||
|
TerminalAtom, TerminalEvent
|
||||||
|
},
|
||||||
|
r3vi::{
|
||||||
|
buffer::{singleton::*, vec::*},
|
||||||
|
view::{port::UpdateTask, singleton::*, list::*, sequence::*},
|
||||||
|
projection::*
|
||||||
|
},
|
||||||
|
std::sync::{Arc, RwLock},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
|
||||||
|
/* setup context
|
||||||
|
*/
|
||||||
|
let ctx = Arc::new(RwLock::new(Context::new()));
|
||||||
|
nested::editors::char::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::digit::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::integer::init_ctx( ctx.clone() );
|
||||||
|
nested::editors::list::init_ctx( ctx.clone() );
|
||||||
|
nested_tty::setup_edittree_hook(&ctx);
|
||||||
|
|
||||||
|
eprintln!(
|
||||||
|
"Char = {:?}\nu64 = {:?}\nEditTree = {:?}, <Vec EditTree> = {:?}",
|
||||||
|
Context::parse(&ctx, "Char"),
|
||||||
|
Context::parse(&ctx, "machine.UInt64"),
|
||||||
|
Context::parse(&ctx, "EditTree"),
|
||||||
|
Context::parse(&ctx, "<Vec EditTree>")
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut red = nested::repr_tree::ReprTree::from_str(Context::parse(&ctx, "
|
||||||
|
ℕ ~ <PosInt 10 BigEndian> ~ <Seq <Digit 10>> ~ <List <Digit 10> ~ Char> ~ <Vec Char>
|
||||||
|
"),
|
||||||
|
"221"
|
||||||
|
);
|
||||||
|
ctx.read().unwrap().apply_morphism( &red,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10> ~ Char > ~ <Vec Char>"),
|
||||||
|
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > ~ EditTree")
|
||||||
|
});
|
||||||
|
let red_edit = ctx.read().unwrap().setup_edittree(
|
||||||
|
red.descend(Context::parse(&ctx, "
|
||||||
|
ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16>~Char>
|
||||||
|
")).unwrap(),
|
||||||
|
SingletonBuffer::new(0).get_port()
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
let mut green = nested::repr_tree::ReprTree::from_str(Context::parse(&ctx, "
|
||||||
|
ℕ ~ <PosInt 10 BigEndian> ~ <Seq <Digit 10>> ~ <List <Digit 10> ~ Char> ~ <Vec Char>
|
||||||
|
"),
|
||||||
|
"220"
|
||||||
|
);
|
||||||
|
ctx.read().unwrap().apply_morphism( &green,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10> ~ Char > ~ <Vec Char>"),
|
||||||
|
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > ~ EditTree")
|
||||||
|
});
|
||||||
|
let green_edit = ctx.read().unwrap().setup_edittree(green.descend(Context::parse(&ctx, "
|
||||||
|
ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16>~Char>
|
||||||
|
")).unwrap(),
|
||||||
|
SingletonBuffer::new(0).get_port()
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
|
||||||
|
let mut blue = nested::repr_tree::ReprTree::from_str(Context::parse(&ctx, "
|
||||||
|
ℕ ~ <PosInt 10 BigEndian> ~ <Seq <Digit 10>> ~ <List <Digit 10> ~ Char> ~ <Vec Char>
|
||||||
|
"),
|
||||||
|
"5"
|
||||||
|
);
|
||||||
|
ctx.read().unwrap().apply_morphism( &blue,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10> ~ Char > ~ <Vec Char>"),
|
||||||
|
dst_type: Context::parse(&ctx, "ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > ~ EditTree")
|
||||||
|
});
|
||||||
|
let blue_edit = ctx.read().unwrap().setup_edittree(
|
||||||
|
blue.descend(Context::parse(&ctx, "
|
||||||
|
ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16>~Char>
|
||||||
|
")).unwrap(),
|
||||||
|
SingletonBuffer::new(0).get_port()
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
|
||||||
|
eprintln!("======\n M A K E L I S T E D I T O R\n======\n");
|
||||||
|
|
||||||
|
let mut color = nested::repr_tree::ReprTree::new_arc(
|
||||||
|
Context::parse(&ctx, "<List ℕ>")
|
||||||
|
);
|
||||||
|
|
||||||
|
color.insert_leaf(
|
||||||
|
Context::parse(&ctx, "
|
||||||
|
<List ℕ
|
||||||
|
~ <PosInt 16 BigEndian>
|
||||||
|
~ <Seq <Digit 16>>
|
||||||
|
~ <List <Digit 16>
|
||||||
|
~ Char >
|
||||||
|
>
|
||||||
|
~ <List EditTree>
|
||||||
|
~ <Vec EditTree>
|
||||||
|
"),
|
||||||
|
|
||||||
|
ReprLeaf::from_vec_buffer(VecBuffer::<
|
||||||
|
Arc<RwLock< EditTree >>
|
||||||
|
>::with_data(vec![
|
||||||
|
red_edit.get(),
|
||||||
|
green_edit.get(),
|
||||||
|
blue_edit.get()
|
||||||
|
]))
|
||||||
|
);
|
||||||
|
ctx.read().unwrap().apply_morphism(
|
||||||
|
&color,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > ~ EditTree > ~ <Vec EditTree>"),
|
||||||
|
dst_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > > ~ EditTree")
|
||||||
|
});
|
||||||
|
let edit = ctx.read().unwrap().setup_edittree(
|
||||||
|
color.descend(Context::parse(&ctx, "
|
||||||
|
<List ℕ
|
||||||
|
~ < PosInt 16 BigEndian >
|
||||||
|
~ < Seq~List <Digit 16>
|
||||||
|
~ Char >
|
||||||
|
>
|
||||||
|
")).unwrap(),
|
||||||
|
SingletonBuffer::new(0).get_port()
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
eprintln!(" edittree => list list char ");
|
||||||
|
ctx.read().unwrap().apply_morphism(
|
||||||
|
&color,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > > ~ EditTree"),
|
||||||
|
dst_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char > >")
|
||||||
|
});
|
||||||
|
|
||||||
|
eprintln!("list char ==> list u64");
|
||||||
|
ctx.read().unwrap().apply_morphism(
|
||||||
|
&color,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ Char>>"),
|
||||||
|
dst_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ ℤ_2^64 ~ machine.UInt64>>")
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
|
||||||
|
ctx.read().unwrap().apply_morphism(
|
||||||
|
&color,
|
||||||
|
&laddertypes::MorphismType {
|
||||||
|
src_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16> ~ ℤ_2^64 ~ machine.UInt64 > >"),
|
||||||
|
dst_type: Context::parse(&ctx, "<List ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10> ~ Char > >")
|
||||||
|
});
|
||||||
|
/*
|
||||||
|
let edit2 = ctx.read().unwrap().setup_edittree(
|
||||||
|
color.descend(Context::parse(&ctx, "
|
||||||
|
<List ℕ
|
||||||
|
~ < PosInt 10 BigEndian >
|
||||||
|
~ < Seq~List <Digit 10>
|
||||||
|
~ Char >
|
||||||
|
>
|
||||||
|
")).unwrap(),
|
||||||
|
SingletonBuffer::new(0).get_port()
|
||||||
|
).unwrap();
|
||||||
|
*/
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* setup terminal
|
||||||
|
*/
|
||||||
|
let app = TTYApplication::new({
|
||||||
|
/* event handler
|
||||||
|
*/
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
let edit = edit.get().clone();
|
||||||
|
|
||||||
|
edit.write().unwrap().goto(TreeCursor::home());
|
||||||
|
|
||||||
|
move |ev| {
|
||||||
|
edit.write().unwrap().send_cmd_obj( ev.to_repr_tree(&ctx) );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Setup the compositor to serve as root-view
|
||||||
|
* by routing it to the `app.port` Viewport,
|
||||||
|
* so it will be displayed on TTY-output.
|
||||||
|
*/
|
||||||
|
let compositor = TerminalCompositor::new(app.port.inner());
|
||||||
|
|
||||||
|
/* Now add some views to our compositor
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
let mut comp = compositor.write().unwrap();
|
||||||
|
|
||||||
|
fn show_edit_tree( ctx: &Arc<RwLock<Context>>, comp: &mut TerminalCompositor, rt: &Arc<RwLock<ReprTree>>, y: i16 )
|
||||||
|
{
|
||||||
|
let rt_edittree = rt.descend(Context::parse(&ctx, "EditTree")).expect("descend");
|
||||||
|
let halo_type = rt_edittree.read().unwrap().get_halo_type().clone();
|
||||||
|
let edittree = rt_edittree.read().unwrap().get_view::<dyn r3vi::view::singleton::SingletonView<Item = Arc<RwLock<EditTree>>>>().unwrap().get().read().unwrap().clone();
|
||||||
|
|
||||||
|
comp.push( nested_tty::make_label( &ctx.read().unwrap().type_term_to_str(&halo_type) )
|
||||||
|
.map_item(|_pt, atom| atom.add_style_front(TerminalStyle::fg_color((90,90,90))))
|
||||||
|
.offset(Vector2::new(1,y)));
|
||||||
|
|
||||||
|
comp.push( edittree.display_view()
|
||||||
|
.offset(Vector2::new(1,y+1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
show_edit_tree( &ctx, &mut comp, &color.descend(Context::parse(&ctx, "<List ℕ ~ <PosInt 16 BigEndian> ~ <Seq~List <Digit 16>~Char>>")).unwrap(), 1 );
|
||||||
|
show_edit_tree( &ctx, &mut comp, &color.descend(Context::parse(&ctx, "<List ℕ ~ <PosInt 10 BigEndian> ~ <Seq~List <Digit 10>~Char>>")).unwrap(), 3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write the changes in the view of `term_port` to the terminal
|
||||||
|
*/
|
||||||
|
app.show().await.expect("output error!");
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,14 @@ use {
|
||||||
|
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
|
enum GravityMode {
|
||||||
|
// tries to maintain a set distance from bottom
|
||||||
|
Gravity(usize),
|
||||||
|
|
||||||
|
// keeps equal distance from root
|
||||||
|
Floating
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Eq, PartialEq, Debug)]
|
#[derive(Clone, Eq, PartialEq, Debug)]
|
||||||
pub struct TreeCursor {
|
pub struct TreeCursor {
|
||||||
pub leaf_mode: ListCursorMode,
|
pub leaf_mode: ListCursorMode,
|
||||||
|
|
|
@ -59,15 +59,39 @@ pub fn init_ctx( ctx: Arc<RwLock<Context>> ) {
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.read().unwrap().setup_edittree(
|
ctx.read().unwrap().setup_edittree(
|
||||||
rt.clone(),
|
rt
|
||||||
SingletonBuffer::new(0).get_port()
|
// SingletonBuffer::new(0).get_port()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let char_morph_from_edittree = GenericReprTreeMorphism::new(
|
||||||
|
Context::parse(&ctx, "Char~EditTree"),
|
||||||
|
Context::parse(&ctx, "Char"),
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
move |rt, σ|
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
let mut b = rt
|
||||||
|
.descend(Context::parse(&ctx, "EditTree")).unwrap()
|
||||||
|
.view_singleton::<Arc<RwLock<EditTree>>>();
|
||||||
|
|
||||||
|
rt.attach_leaf_to(
|
||||||
|
Context::parse(&ctx, "Char"),
|
||||||
|
b.map(|x|
|
||||||
|
x.read().unwrap()
|
||||||
|
.get_edit::<CharEditor>().unwrap()
|
||||||
|
.read().unwrap()
|
||||||
|
.get())
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
});
|
||||||
ctx.write().unwrap().morphisms.add_morphism( char_morph_to_edittree );
|
ctx.write().unwrap().morphisms.add_morphism( char_morph_to_edittree );
|
||||||
|
ctx.write().unwrap().morphisms.add_morphism( char_morph_from_edittree );
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CharEditor {
|
pub struct CharEditor {
|
||||||
|
|
|
@ -170,9 +170,54 @@ pub fn init_ctx(ctx: Arc<RwLock<Context>>) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let posint_list_morph_from_u64 = GenericReprTreeMorphism::new(
|
||||||
|
Context::parse(&ctx, "ℕ ~ machine.UInt64"),
|
||||||
|
Context::parse(&ctx, "ℕ ~ <PosInt 0 LittleEndian> ~ <Seq~List <Digit 0>~ℤ_2^64~machine.UInt64>"),
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
move |rt, σ| {
|
||||||
|
let digits = rt
|
||||||
|
.descend(Context::parse(&ctx, "ℕ ~ machine.UInt64")).unwrap()
|
||||||
|
.view_u64()
|
||||||
|
.to_sequence()
|
||||||
|
.to_list();
|
||||||
|
|
||||||
|
rt.attach_leaf_to(
|
||||||
|
Context::parse(&ctx, "ℕ ~ <PosInt 0 LittleEndian> ~ <Seq~List <Digit 0>~ℤ_2^64~machine.UInt64>"),
|
||||||
|
digits
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
let posint_list_morph_to_u64 = GenericReprTreeMorphism::new(
|
||||||
|
Context::parse(&ctx, "ℕ ~ <PosInt 0 LittleEndian> ~ <Seq~List <Digit 0>~ℤ_2^64~machine.UInt64>"),
|
||||||
|
Context::parse(&ctx, "ℕ ~ machine.UInt64"),
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
move |rt, σ| {
|
||||||
|
/*
|
||||||
|
let u64_view = rt
|
||||||
|
.descend(Context::parse(&ctx, "ℕ ~ <PosInt 2^64 LittleEndian> ~ <Seq~List <Digit 2^64>~ℤ_2^64~machine.UInt64>"),
|
||||||
|
.view_list()
|
||||||
|
.to_singleton()
|
||||||
|
.map(||{
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
rt.attach_leaf_to(
|
||||||
|
Context::parse(&ctx, "ℕ ~ machine.UInt64")).unwrap()
|
||||||
|
u64_view
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
ctx.write().unwrap().morphisms.add_morphism( posint_seq_morph_big_to_little );
|
ctx.write().unwrap().morphisms.add_morphism( posint_seq_morph_big_to_little );
|
||||||
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_big_to_little );
|
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_big_to_little );
|
||||||
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_little_to_big );
|
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_little_to_big );
|
||||||
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_radix );
|
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_radix );
|
||||||
|
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_from_u64 );
|
||||||
|
ctx.write().unwrap().morphisms.add_morphism( posint_list_morph_to_u64 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,9 +116,13 @@ impl RadixProjection {
|
||||||
if val == 0 {
|
if val == 0 {
|
||||||
self.dst_digits.push(0);
|
self.dst_digits.push(0);
|
||||||
} else {
|
} else {
|
||||||
while val > 0 {
|
if self.dst_radix == 0 {
|
||||||
self.dst_digits.push(val % self.dst_radix);
|
self.dst_digits.push(val);
|
||||||
val /= self.dst_radix;
|
} else {
|
||||||
|
while val > 0 {
|
||||||
|
self.dst_digits.push(val % self.dst_radix);
|
||||||
|
val /= self.dst_radix;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,8 +91,33 @@ pub fn init_ctx(ctx: Arc<RwLock<Context>>) {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let list_morph_editsetup3 = GenericReprTreeMorphism::new(
|
||||||
|
Context::parse(&ctx, "<List Item> ~ EditTree"),
|
||||||
|
Context::parse(&ctx, "<List Item> ~ <List EditTree>"),
|
||||||
|
{
|
||||||
|
let ctx = ctx.clone();
|
||||||
|
move |src_rt, σ| {
|
||||||
|
let edittree =
|
||||||
|
src_rt
|
||||||
|
.descend(
|
||||||
|
Context::parse(&ctx, "<List Item>~EditTree")
|
||||||
|
.apply_substitution(&|x| σ.get(x).cloned()).clone()
|
||||||
|
).unwrap()
|
||||||
|
.singleton_buffer::<Arc<RwLock<EditTree>>>();
|
||||||
|
|
||||||
|
let list_edit = edittree.get().read().unwrap().get_edit::< ListEditor >().unwrap();
|
||||||
|
let edittree_items = list_edit.read().unwrap().data.get_port().to_list();
|
||||||
|
|
||||||
|
src_rt.attach_leaf_to(
|
||||||
|
Context::parse(&ctx, "<List Item> ~ <List EditTree>")
|
||||||
|
.apply_substitution(&|x| σ.get(x).cloned()).clone(),
|
||||||
|
edittree_items
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -16,14 +16,13 @@ use {
|
||||||
|
|
||||||
pub struct ListEditor {
|
pub struct ListEditor {
|
||||||
pub cursor: SingletonBuffer<ListCursor>,
|
pub cursor: SingletonBuffer<ListCursor>,
|
||||||
|
|
||||||
// todo: (?) remove RwLock<..> around NestedNode ??
|
|
||||||
pub data: VecBuffer< Arc<RwLock<EditTree>> >,
|
pub data: VecBuffer< Arc<RwLock<EditTree>> >,
|
||||||
|
|
||||||
pub spillbuf: Arc<RwLock<Vec<Arc<RwLock<EditTree>>>>>,
|
pub spillbuf: Arc<RwLock<Vec<Arc<RwLock<EditTree>>>>>,
|
||||||
|
|
||||||
pub(super) addr_port: OuterViewPort<dyn SequenceView<Item = isize>>,
|
pub(super) addr_port: OuterViewPort<dyn SequenceView<Item = isize>>,
|
||||||
pub(super) mode_port: OuterViewPort<dyn SingletonView<Item = ListCursorMode>>,
|
pub(super) mode_port: OuterViewPort<dyn SingletonView<Item = ListCursorMode>>,
|
||||||
|
// pub(super) grav_port: OuterViewPort<dyn SingletonView<Item = isize>>,
|
||||||
|
|
||||||
depth: OuterViewPort<dyn SingletonView<Item = usize>>,
|
depth: OuterViewPort<dyn SingletonView<Item = usize>>,
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,10 @@ use {
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum ProductEditorSegment {
|
pub enum ProductEditorSegment {
|
||||||
|
/// Terminal Node, i.e. literal, immutable string
|
||||||
T( String, usize ),
|
T( String, usize ),
|
||||||
|
|
||||||
|
/// Nonterminal Node, i.e. sub-editor for type t
|
||||||
N {
|
N {
|
||||||
t: TypeTerm,
|
t: TypeTerm,
|
||||||
editor: Option<NestedNode>,
|
editor: Option<NestedNode>,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use {
|
use {
|
||||||
laddertypes::{TypeTerm, TypeID, morphism::Morphism},
|
laddertypes::{TypeTerm, TypeID, morphism::Morphism},
|
||||||
r3vi::view::{AnyOuterViewPort, port::UpdateTask},
|
r3vi::view::{AnyOuterViewPort, port::*, list::*},
|
||||||
crate::{
|
crate::{
|
||||||
repr_tree::{ReprTree, ReprTreeExt, ReprLeaf},
|
repr_tree::{ReprTree, ReprTreeExt, ReprLeaf},
|
||||||
},
|
},
|
||||||
|
@ -77,52 +77,68 @@ impl GenericReprTreeMorphism {
|
||||||
lst_map_type.src_type.apply_substitution( &|x| subst.get(x).cloned() );
|
lst_map_type.src_type.apply_substitution( &|x| subst.get(x).cloned() );
|
||||||
lst_map_type.dst_type.apply_substitution( &|x| subst.get(x).cloned() );
|
lst_map_type.dst_type.apply_substitution( &|x| subst.get(x).cloned() );
|
||||||
|
|
||||||
|
lst_map_type = lst_map_type.normalize();
|
||||||
|
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"lst map type : {:?}", lst_map_type
|
"lst map type ::\n {:?}\n===> {:?}\n\n", lst_map_type.src_type, lst_map_type.dst_type
|
||||||
);
|
);
|
||||||
|
|
||||||
let src_port = repr_tree
|
|
||||||
.descend( lst_map_type.src_type.clone() )
|
let mut item_ladder = item_morph.morph_type.src_type.clone().get_lnf_vec();
|
||||||
.expect("descend src seq")
|
let top_type = item_ladder.remove( item_ladder.len() - 1 );
|
||||||
.view_list::<SrcItem>();
|
|
||||||
|
|
||||||
let subst = subst.clone();
|
if let Ok(item_sigma) = laddertypes::unify(
|
||||||
let item_morph = item_morph.clone();
|
&top_type,
|
||||||
|
&TypeTerm::App(vec![
|
||||||
|
TypeTerm::TypeID( list_typeid ),
|
||||||
|
TypeTerm::TypeID( TypeID::Var( 200 ) )
|
||||||
|
])
|
||||||
|
) {
|
||||||
|
eprintln!("List OF List...");
|
||||||
|
} else {
|
||||||
|
let src_port = repr_tree
|
||||||
|
.descend( lst_map_type.src_type.clone() )
|
||||||
|
.expect("descend src seq")
|
||||||
|
.view_list::<SrcItem>();
|
||||||
|
|
||||||
let dst_view = src_port.map(
|
let subst = subst.clone();
|
||||||
|
let item_morph = item_morph.clone();
|
||||||
|
|
||||||
|
let dst_view = src_port.map(
|
||||||
move |x| {
|
move |x| {
|
||||||
let mut item_ladder = item_morph.morph_type.src_type.clone().get_lnf_vec();
|
|
||||||
let mut item_rt = ReprTree::from_singleton_buffer(
|
let mut item_rt = ReprTree::from_singleton_buffer(
|
||||||
item_ladder.remove( item_ladder.len() - 1 ),
|
top_type.clone(),
|
||||||
r3vi::buffer::singleton::SingletonBuffer::new(x.clone())
|
r3vi::buffer::singleton::SingletonBuffer::new(x.clone())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// TODO: required?
|
// TODO: required?
|
||||||
while item_ladder.len() > 0 {
|
for t in item_ladder.iter().rev() {
|
||||||
let mut n = ReprTree::new_arc( item_ladder.remove( item_ladder.len() - 1) );
|
let mut n = ReprTree::new_arc( t.clone() );
|
||||||
n.insert_branch( item_rt );
|
n.insert_branch( item_rt );
|
||||||
item_rt = n;
|
item_rt = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
(item_morph.setup_projection)( &mut item_rt, &subst );
|
(item_morph.setup_projection)( &mut item_rt, &subst );
|
||||||
item_rt.descend( item_morph.morph_type.dst_type.clone() ).expect("descend to item rt")
|
item_rt.descend( item_morph.morph_type.dst_type.clone() ).expect("descend to item rt")
|
||||||
.view_singleton::< DstItem >()
|
.view_singleton::< DstItem >()
|
||||||
.get_view().unwrap()
|
.get_view().unwrap()
|
||||||
.get()
|
.get()
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
repr_tree.attach_leaf_to(
|
repr_tree.attach_leaf_to(
|
||||||
lst_map_type.dst_type.clone(),
|
lst_map_type.dst_type.clone(),
|
||||||
dst_view as r3vi::view::OuterViewPort::< dyn r3vi::view::list::ListView<DstItem> >
|
dst_view as r3vi::view::OuterViewPort::< dyn r3vi::view::list::ListView<DstItem> >
|
||||||
);
|
);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_list_map_dyn(&self, typeid_list: TypeID)
|
pub fn into_list_map_dyn(&self, typeid_list: TypeID)
|
||||||
-> Option< GenericReprTreeMorphism >
|
-> Option< GenericReprTreeMorphism >
|
||||||
{
|
{
|
||||||
|
let typeid_list = TypeID::Fun(0);
|
||||||
let typeid_char = TypeID::Fun(1);
|
let typeid_char = TypeID::Fun(1);
|
||||||
let typeid_u64 = TypeID::Fun(5);
|
let typeid_u64 = TypeID::Fun(5);
|
||||||
let typeid_edittree = TypeID::Fun(2);
|
let typeid_edittree = TypeID::Fun(2);
|
||||||
|
@ -131,6 +147,16 @@ impl GenericReprTreeMorphism {
|
||||||
let dst_item_type_lnf = self.morph_type.dst_type.clone().get_lnf_vec();
|
let dst_item_type_lnf = self.morph_type.dst_type.clone().get_lnf_vec();
|
||||||
|
|
||||||
if src_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_char)) &&
|
if src_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_char)) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_char))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< char, char >(typeid_list) )
|
||||||
|
}
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_u64)) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_u64))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< u64, u64 >(typeid_list) )
|
||||||
|
}
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_char)) &&
|
||||||
dst_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_u64))
|
dst_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_u64))
|
||||||
{
|
{
|
||||||
Some( self.into_list_map::< char, u64 >(typeid_list) )
|
Some( self.into_list_map::< char, u64 >(typeid_list) )
|
||||||
|
@ -145,6 +171,33 @@ impl GenericReprTreeMorphism {
|
||||||
{
|
{
|
||||||
Some( self.into_list_map::< char, Arc<RwLock<crate::edit_tree::EditTree>> >(typeid_list) )
|
Some( self.into_list_map::< char, Arc<RwLock<crate::edit_tree::EditTree>> >(typeid_list) )
|
||||||
}
|
}
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_edittree)) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::TypeID(typeid_char))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< Arc<RwLock<crate::edit_tree::EditTree>>, char >(typeid_list) )
|
||||||
|
}
|
||||||
|
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_char) ])) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_char) ]))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< char, char >(typeid_list) )
|
||||||
|
}
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_u64) ])) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_u64) ]))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< u64, u64 >(typeid_list) )
|
||||||
|
}
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_char) ])) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_u64) ]))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< OuterViewPort<dyn ListView<char>>, OuterViewPort<dyn ListView<u64>> >(typeid_list) )
|
||||||
|
}
|
||||||
|
else if src_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_u64) ])) &&
|
||||||
|
dst_item_type_lnf.last() == Some(&TypeTerm::App(vec![ TypeTerm::TypeID(typeid_list), TypeTerm::TypeID(typeid_char) ]))
|
||||||
|
{
|
||||||
|
Some( self.into_list_map::< OuterViewPort<dyn ListView<u64>>, OuterViewPort<dyn ListView<char>> >(typeid_list) )
|
||||||
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
eprintln!("no list map type for {:?}", dst_item_type_lnf.last());
|
eprintln!("no list map type for {:?}", dst_item_type_lnf.last());
|
||||||
|
@ -154,16 +207,4 @@ impl GenericReprTreeMorphism {
|
||||||
}
|
}
|
||||||
|
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
/*
|
|
||||||
impl MorphismType {
|
|
||||||
pub fn to_str(&self, ctx: &Context) -> String {
|
|
||||||
format!("{:?} -> {:?}",
|
|
||||||
if let Some(t) = self.src_type.as_ref() {
|
|
||||||
ctx.type_dict.read().unwrap().unparse(t)
|
|
||||||
} else {
|
|
||||||
"None".into()
|
|
||||||
},
|
|
||||||
ctx.type_dict.read().unwrap().unparse(&self.dst_type))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
|
@ -392,3 +392,4 @@ impl ReprTree {
|
||||||
|
|
||||||
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -121,7 +121,8 @@ pub fn setup_edittree_hook(ctx: &Arc<RwLock<Context>>) {
|
||||||
let char_type = Context::parse(&ctx, "Char");
|
let char_type = Context::parse(&ctx, "Char");
|
||||||
let digit_type = Context::parse(&ctx, "<Digit Radix>");
|
let digit_type = Context::parse(&ctx, "<Digit Radix>");
|
||||||
let list_type = Context::parse(&ctx, "<List Item>");
|
let list_type = Context::parse(&ctx, "<List Item>");
|
||||||
let posint_type = Context::parse(&ctx, "<PosInt Radix>");
|
let posint_dec_type = Context::parse(&ctx, "<PosInt 10 BigEndian>");
|
||||||
|
let posint_hex_type = Context::parse(&ctx, "<PosInt 16 BigEndian>");
|
||||||
let item_tyid = ctx.read().unwrap().get_var_typeid("Item").unwrap();
|
let item_tyid = ctx.read().unwrap().get_var_typeid("Item").unwrap();
|
||||||
|
|
||||||
ctx.write().unwrap().meta_chars.push(',');
|
ctx.write().unwrap().meta_chars.push(',');
|
||||||
|
@ -134,18 +135,20 @@ pub fn setup_edittree_hook(ctx: &Arc<RwLock<Context>>) {
|
||||||
ctx.write().unwrap().set_edittree_hook(
|
ctx.write().unwrap().set_edittree_hook(
|
||||||
Arc::new(
|
Arc::new(
|
||||||
move |et: &mut nested::edit_tree::EditTree, t: laddertypes::TypeTerm| {
|
move |et: &mut nested::edit_tree::EditTree, t: laddertypes::TypeTerm| {
|
||||||
// let mut et = et.write().unwrap();
|
|
||||||
|
|
||||||
if let Ok(σ) = laddertypes::unify(&t, &char_type.clone()) {
|
if let Ok(σ) = laddertypes::unify(&t, &char_type.clone()) {
|
||||||
*et = crate::editors::edittree_make_char_view(et.clone());
|
*et = crate::editors::edittree_make_char_view(et.clone());
|
||||||
}
|
}
|
||||||
else if let Ok(σ) = laddertypes::unify(&t, &digit_type) {
|
else if let Ok(σ) = laddertypes::unify(&t, &digit_type) {
|
||||||
*et = crate::editors::edittree_make_digit_view(et.clone());
|
*et = crate::editors::edittree_make_digit_view(et.clone());
|
||||||
}
|
}
|
||||||
else if let Ok(σ) = laddertypes::unify(&t, &posint_type) {
|
else if let Ok(σ) = laddertypes::unify(&t, &posint_dec_type) {
|
||||||
crate::editors::list::PTYListStyle::for_node( &mut *et, ("0d", "", ""));
|
crate::editors::list::PTYListStyle::for_node( &mut *et, ("0d", "", ""));
|
||||||
crate::editors::list::PTYListController::for_node( &mut *et, None, None );
|
crate::editors::list::PTYListController::for_node( &mut *et, None, None );
|
||||||
}
|
}
|
||||||
|
else if let Ok(σ) = laddertypes::unify(&t, &posint_hex_type) {
|
||||||
|
crate::editors::list::PTYListStyle::for_node( &mut *et, ("0x", "", ""));
|
||||||
|
crate::editors::list::PTYListController::for_node( &mut *et, None, None );
|
||||||
|
}
|
||||||
else if let Ok(σ) = laddertypes::unify(&t, &list_type) {
|
else if let Ok(σ) = laddertypes::unify(&t, &list_type) {
|
||||||
let item_type = σ.get( &laddertypes::TypeID::Var(item_tyid) ).unwrap();
|
let item_type = σ.get( &laddertypes::TypeID::Var(item_tyid) ).unwrap();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue