2023-08-21 15:49:07 +02:00
|
|
|
use {
|
2023-09-08 13:40:06 +02:00
|
|
|
r3vi::{
|
|
|
|
view::{OuterViewPort, singleton::*}
|
|
|
|
},
|
2023-11-12 18:07:20 +01:00
|
|
|
laddertypes::{TypeTerm},
|
2023-08-21 15:49:07 +02:00
|
|
|
crate::{
|
2024-01-18 19:32:49 +01:00
|
|
|
repr_tree::{Context, MorphismType},
|
2023-09-08 13:40:06 +02:00
|
|
|
editors::{
|
2023-11-24 21:26:17 +01:00
|
|
|
list::{ListEditor, ListSegmentSequence},
|
2023-09-08 13:40:06 +02:00
|
|
|
typeterm::{State, TypeTermEditor}
|
2023-11-24 21:26:17 +01:00
|
|
|
}
|
2023-08-21 15:49:07 +02:00
|
|
|
},
|
2023-08-21 16:31:44 +02:00
|
|
|
std::{sync::{Arc, RwLock}},
|
|
|
|
cgmath::{Point2}
|
2023-08-21 15:49:07 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
pub fn init_ctx(ctx: &mut Context) {
|
|
|
|
ctx.add_list_typename("Type".into()); // = Lit | Sym | App | Ladder
|
|
|
|
ctx.add_list_typename("Type::Lit".into()); // = Num | char
|
|
|
|
ctx.add_list_typename("Type::Lit::Num".into()); // [0-9]*
|
|
|
|
ctx.add_list_typename("Type::Lit::Char".into()); // .
|
|
|
|
ctx.add_list_typename("Type::Sym".into()); // = Fun | Var
|
|
|
|
ctx.add_list_typename("Type::Sym::Fun".into()); // [a-zA-Z][a-zA-Z0-9]*
|
|
|
|
ctx.add_list_typename("Type::Sym::Var".into()); // [a-zA-Z][a-zA-Z0-9]*
|
|
|
|
ctx.add_list_typename("Type::App".into()); // = <T1 T2 ...>
|
|
|
|
ctx.add_list_typename("Type::Ladder".into()); // = T1~T2~...
|
|
|
|
|
2024-01-04 15:39:39 +01:00
|
|
|
/*
|
2023-08-21 15:49:07 +02:00
|
|
|
ctx.add_morphism(
|
2024-01-18 19:32:49 +01:00
|
|
|
MorphismType { src_tyid: Context::parse(&ctx, "<List T>"), dst_tyid: Context::parse(&ctx, "Type") },
|
2023-08-21 16:31:44 +02:00
|
|
|
Arc::new(move |node, _dst_type:_| {
|
2023-09-04 05:56:33 +02:00
|
|
|
let ctx : Arc<RwLock<Context>> = Arc::new(RwLock::new(Context::with_parent(Some(node.ctx.clone()))));
|
|
|
|
ctx.write().unwrap().meta_chars.push('~');
|
|
|
|
|
2023-09-08 13:40:06 +02:00
|
|
|
let new_node = TypeTermEditor::with_node( ctx, node.clone(), State::Any );
|
2023-08-21 15:49:07 +02:00
|
|
|
Some(new_node)
|
|
|
|
}));
|
2024-01-04 15:39:39 +01:00
|
|
|
*/
|
2023-11-24 21:26:17 +01:00
|
|
|
/*
|
2023-08-21 15:49:07 +02:00
|
|
|
ctx.add_morphism(
|
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("List"), dst_tyid: ctx.get_typeid("Type::Ladder").unwrap() },
|
|
|
|
Arc::new(|mut node, _dst_type: _| {
|
|
|
|
PTYListController::for_node( &mut node, Some('~'), None );
|
2023-08-23 21:53:05 +02:00
|
|
|
|
2023-09-14 13:17:50 +02:00
|
|
|
let vertical_view = true;
|
2023-08-23 21:53:05 +02:00
|
|
|
if vertical_view {
|
|
|
|
let editor = node.get_edit::<crate::editors::list::ListEditor>().unwrap();
|
|
|
|
let mut e = editor.write().unwrap();
|
2023-09-08 13:40:06 +02:00
|
|
|
let seg_view = PTYListStyle::new( ("","~","") ).get_seg_seq_view( &mut e );
|
2023-08-23 21:53:05 +02:00
|
|
|
|
|
|
|
node = node.set_view(
|
2023-09-14 13:17:50 +02:00
|
|
|
seg_view.to_grid_vertical()
|
|
|
|
.map_item(
|
|
|
|
|pt,x|
|
|
|
|
if pt.y > 0 {
|
|
|
|
r3vi::buffer::vec::VecBuffer::with_data(vec![
|
|
|
|
crate::terminal::make_label("~"),
|
|
|
|
x.clone()
|
|
|
|
])
|
|
|
|
.get_port()
|
|
|
|
.to_sequence()
|
|
|
|
.to_grid_horizontal()
|
|
|
|
.flatten()
|
|
|
|
} else {
|
|
|
|
x.clone()
|
|
|
|
}
|
|
|
|
).flatten()
|
2023-08-23 21:53:05 +02:00
|
|
|
);
|
|
|
|
} else {
|
|
|
|
PTYListStyle::for_node( &mut node, ("","~","") );
|
|
|
|
}
|
|
|
|
|
2023-08-21 15:49:07 +02:00
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_morphism(
|
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("List"), dst_tyid: ctx.get_typeid("Type::App").unwrap() },
|
|
|
|
Arc::new( |mut node, _dst_type: _| {
|
|
|
|
PTYListController::for_node( &mut node, Some(' '), Some('>') );
|
|
|
|
PTYListStyle::for_node( &mut node, ("<"," ",">") );
|
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_morphism(
|
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("List"), dst_tyid: ctx.get_typeid("Type::Sym").unwrap() },
|
|
|
|
Arc::new(|mut node, _dst_type:_| {
|
|
|
|
PTYListController::for_node( &mut node, Some(' '), None );
|
|
|
|
PTYListStyle::for_node( &mut node, ("","","") );
|
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_morphism(
|
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("List"), dst_tyid: ctx.get_typeid("Type::Sym::Fun").unwrap() },
|
|
|
|
Arc::new(|mut node, _dst_type:_| {
|
|
|
|
PTYListController::for_node( &mut node, Some(' '), None );
|
|
|
|
PTYListStyle::for_node( &mut node, ("","","") );
|
2023-09-08 13:40:06 +02:00
|
|
|
|
2023-08-21 15:49:07 +02:00
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_morphism(
|
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("List"), dst_tyid: ctx.get_typeid("Type::Sym::Var").unwrap() },
|
|
|
|
Arc::new(|mut node, _dst_type:_| {
|
|
|
|
PTYListController::for_node( &mut node, Some(' '), None );
|
|
|
|
PTYListStyle::for_node( &mut node, ("","","") );
|
|
|
|
|
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_morphism(
|
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("PosInt"), dst_tyid: ctx.get_typeid("Type::Lit::Num").unwrap() },
|
2023-08-21 16:31:44 +02:00
|
|
|
Arc::new(|node, _dst_type:_| {
|
2023-08-21 15:49:07 +02:00
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_morphism(
|
2023-09-04 01:24:53 +02:00
|
|
|
MorphismTypePattern { src_tyid: ctx.get_typeid("Char"), dst_tyid: ctx.get_typeid("Type::Lit::Char").unwrap() },
|
2023-08-21 15:49:07 +02:00
|
|
|
Arc::new(|mut node, _dst_type:_| {
|
2023-09-14 13:17:50 +02:00
|
|
|
node.ctx.write().unwrap().meta_chars = vec![ '\'' ];
|
2023-08-21 15:49:07 +02:00
|
|
|
let mut grid = r3vi::buffer::index_hashmap::IndexBuffer::new();
|
|
|
|
|
|
|
|
grid.insert_iter(
|
|
|
|
vec![
|
|
|
|
(Point2::new(0,0), crate::terminal::make_label("'")),
|
2023-09-04 01:24:53 +02:00
|
|
|
(Point2::new(1,0), node.view.clone().unwrap_or( crate::terminal::make_label(".").with_fg_color((220,200,20))) ),
|
2023-08-21 15:49:07 +02:00
|
|
|
(Point2::new(2,0), crate::terminal::make_label("'")),
|
|
|
|
]
|
|
|
|
);
|
|
|
|
|
|
|
|
node.close_char.set(Some('\''));
|
2023-08-23 21:53:05 +02:00
|
|
|
node = node.set_view(
|
2023-08-21 15:49:07 +02:00
|
|
|
grid.get_port()
|
|
|
|
.flatten()
|
|
|
|
);
|
|
|
|
|
|
|
|
Some(node)
|
|
|
|
}));
|
|
|
|
|
|
|
|
ctx.add_node_ctor("Type", Arc::new(
|
2023-09-08 13:40:06 +02:00
|
|
|
|ctx: Arc<RwLock<Context>>, _ty: TypeTerm, depth: OuterViewPort<dyn SingletonView<Item = usize>>| {
|
2023-08-21 15:49:07 +02:00
|
|
|
Some(TypeTermEditor::new_node(ctx, depth))
|
|
|
|
}));
|
2023-11-24 21:26:17 +01:00
|
|
|
*/
|
2023-08-21 15:49:07 +02:00
|
|
|
}
|
2023-08-21 16:31:44 +02:00
|
|
|
|