remove avl::binary
This commit is contained in:
parent
7ac9ee1bec
commit
56205b8e6e
@ -1,5 +1,3 @@
|
|||||||
pub mod binary;
|
|
||||||
|
|
||||||
use std::{error::Error, fmt::Display, rc::Rc};
|
use std::{error::Error, fmt::Display, rc::Rc};
|
||||||
|
|
||||||
use crate::flow::binary::{balancing::*, *};
|
use crate::flow::binary::{balancing::*, *};
|
||||||
|
@ -1,108 +0,0 @@
|
|||||||
use crate::func::context::*;
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
pub struct AvlReference<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> {
|
|
||||||
node: Point<'a, Ctx, AvlNode<'a, Ctx, A>>,
|
|
||||||
height: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> PartialEq for AvlReference<'a, Ctx, A> {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
self.node == other.node && self.height == other.height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub type AvlResult<'a, Ctx, A, T> = Result<T, AvlError<ParseError<'a, Ctx, Fctr<'a, Ctx, A>>>>;
|
|
||||||
|
|
||||||
pub type AvlNodeResult<'a, Ctx, A> = AvlResult<'a, Ctx, A, AvlNode<'a, Ctx, A>>;
|
|
||||||
|
|
||||||
pub type AvlTreeResult<'a, Ctx, A> = AvlResult<'a, Ctx, A, AvlTree<'a, Ctx, A>>;
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlNode<'a, Ctx, A> {
|
|
||||||
fn parent_height(&self) -> AvlResult<'a, Ctx, A, u64> {
|
|
||||||
std::cmp::max(self.l.height, self.r.height)
|
|
||||||
.checked_add(1)
|
|
||||||
.ok_or(AvlError::Balancing(BalancingError::HeightOverflow))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn into_tree(self) -> AvlTreeResult<'a, Ctx, A> {
|
|
||||||
let height = self.parent_height()?;
|
|
||||||
let node = self.into();
|
|
||||||
Ok(AvlTree { node, height })
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new(
|
|
||||||
l: AvlTree<'a, Ctx, A>,
|
|
||||||
r: AvlTree<'a, Ctx, A>,
|
|
||||||
key: A,
|
|
||||||
) -> AvlNodeResult<'a, Ctx, A> {
|
|
||||||
balanced(l.height, r.height)?;
|
|
||||||
Ok(Self { l, r, key })
|
|
||||||
}
|
|
||||||
|
|
||||||
fn matches_height(&self, parent_height: u64) -> AvlResult<'a, Ctx, A, ()> {
|
|
||||||
let expected = self.parent_height()?;
|
|
||||||
if expected != parent_height {
|
|
||||||
Err(BalancingError::HeightMismatch {
|
|
||||||
children: (self.l.height, self.r.height),
|
|
||||||
parent: parent_height,
|
|
||||||
})?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlTree<'a, Ctx, A> {
|
|
||||||
pub fn empty(factory: Fctr<'a, Ctx, A>) -> Self {
|
|
||||||
Self {
|
|
||||||
node: Nullable::Null(AvlNodeFactory(factory)),
|
|
||||||
height: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn reference(&self) -> Option<AvlReference<'a, Ctx, A>> {
|
|
||||||
match self.node {
|
|
||||||
Nullable::Null(_) => None,
|
|
||||||
Nullable::NotNull(ref point) => Some(AvlReference {
|
|
||||||
node: point.clone(),
|
|
||||||
height: self.height,
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlReference<'a, Ctx, A> {
|
|
||||||
pub fn resolve(&self) -> Resolution<'a, Ctx, AvlNode<'a, Ctx, A>> {
|
|
||||||
let parent_height = self.height;
|
|
||||||
Ctx::fmap(self.node.resolve(), move |resolved| {
|
|
||||||
let node = resolved?;
|
|
||||||
node.matches_height(parent_height)
|
|
||||||
.map_err(ResolutionError::Parse)?;
|
|
||||||
Ok(node)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn height(&self) -> u64 {
|
|
||||||
self.height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Clone for AvlTree<'a, Ctx, A> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
Self {
|
|
||||||
node: self.node.clone(),
|
|
||||||
height: self.height,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone> Clone for AvlNode<'a, Ctx, A> {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
Self {
|
|
||||||
l: self.l.clone(),
|
|
||||||
r: self.r.clone(),
|
|
||||||
key: self.key.clone(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user