remove iter_tools

we only used them for collect_vec. I think its worth the "effort" to write Vec type annotations ourself and have one big crate with way too may features we don't need less
This commit is contained in:
Snowiiii 2024-12-12 23:40:52 +01:00
parent 43c3f03bdb
commit f587cb6748
20 changed files with 56 additions and 99 deletions

View File

@ -61,5 +61,3 @@ uuid = { version = "1.11.0", features = ["serde", "v3", "v4"] }
derive_more = { version = "1.0.0", features = ["full"] } derive_more = { version = "1.0.0", features = ["full"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
itertools = "0.13.0"

View File

@ -13,5 +13,3 @@ num-derive.workspace = true
colored = "2" colored = "2"
md5 = "0.7.0" md5 = "0.7.0"
enum_dispatch = "0.3.13"

View File

@ -12,8 +12,6 @@ pumpkin-core = { path = "../pumpkin-core" }
log.workspace = true log.workspace = true
rayon.workspace = true rayon.workspace = true
itertools.workspace = true
crossbeam.workspace = true
tokio.workspace = true tokio.workspace = true
thiserror.workspace = true thiserror.workspace = true

View File

@ -1,4 +1,3 @@
use itertools::Itertools;
use pumpkin_registry::{ use pumpkin_registry::{
flatten_3x3, get_tag_values, IngredientSlot, IngredientType, RecipeResult, TagCategory, RECIPES, flatten_3x3, get_tag_values, IngredientSlot, IngredientType, RecipeResult, TagCategory, RECIPES,
}; };
@ -76,13 +75,13 @@ fn shapeless_crafting_match(
input: [[Option<ItemStack>; 3]; 3], input: [[Option<ItemStack>; 3]; 3],
pattern: &[[[Option<IngredientSlot>; 3]; 3]], pattern: &[[[Option<IngredientSlot>; 3]; 3]],
) -> bool { ) -> bool {
let mut pattern = pattern let mut pattern: Vec<IngredientSlot> = pattern
.iter() .iter()
.flatten() .flatten()
.flatten() .flatten()
.flatten() .flatten()
.cloned() .cloned()
.collect_vec(); .collect();
for item in input.into_iter().flatten().flatten() { for item in input.into_iter().flatten().flatten() {
if let Some(index) = pattern.iter().enumerate().find_map(|(i, recipe_item)| { if let Some(index) = pattern.iter().enumerate().find_map(|(i, recipe_item)| {
if ingredient_slot_check(recipe_item, item) { if ingredient_slot_check(recipe_item, item) {

View File

@ -1,6 +1,5 @@
use crate::container_click::MouseDragType; use crate::container_click::MouseDragType;
use crate::{Container, InventoryError}; use crate::{Container, InventoryError};
use itertools::Itertools;
use num_traits::Euclid; use num_traits::Euclid;
use pumpkin_world::item::ItemStack; use pumpkin_world::item::ItemStack;
use std::collections::HashMap; use std::collections::HashMap;
@ -73,10 +72,10 @@ impl DragHandler {
Err(InventoryError::MultiplePlayersDragging)? Err(InventoryError::MultiplePlayersDragging)?
} }
let mut slots = container.all_slots(); let mut slots = container.all_slots();
let slots_cloned = slots let slots_cloned: Vec<Option<ItemStack>> = slots
.iter() .iter()
.map(|stack| stack.map(|item| item.to_owned())) .map(|stack| stack.map(|item| item.to_owned()))
.collect_vec(); .collect();
let Some(carried_item) = maybe_carried_item else { let Some(carried_item) = maybe_carried_item else {
return Ok(()); return Ok(());
}; };

View File

@ -9,7 +9,6 @@ proc-macro = true
[dependencies] [dependencies]
serde.workspace = true serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
itertools.workspace = true
proc-macro2 = "1.0" proc-macro2 = "1.0"
quote = "1.0" quote = "1.0"

View File

@ -13,7 +13,6 @@ pumpkin-core = { path = "../pumpkin-core" }
uuid.workspace = true uuid.workspace = true
serde.workspace = true serde.workspace = true
thiserror.workspace = true thiserror.workspace = true
itertools.workspace = true
log.workspace = true log.workspace = true
tokio.workspace = true tokio.workspace = true
num-traits.workspace = true num-traits.workspace = true

View File

@ -1,5 +1,4 @@
use crate::{bytebuf::ByteBuffer, BitSet, ClientPacket, VarInt}; use crate::{bytebuf::ByteBuffer, BitSet, ClientPacket, VarInt};
use itertools::Itertools;
use pumpkin_macros::client_packet; use pumpkin_macros::client_packet;
use pumpkin_world::{chunk::ChunkData, DIRECT_PALETTE_BITS}; use pumpkin_world::{chunk::ChunkData, DIRECT_PALETTE_BITS};
@ -26,7 +25,7 @@ impl ClientPacket for CChunkData<'_> {
data_buf.put_i16(block_count); data_buf.put_i16(block_count);
//// Block states //// Block states
let palette = chunk.iter().dedup().collect_vec(); let palette = chunk;
// TODO: make dynamic block_size work // TODO: make dynamic block_size work
// TODO: make direct block_size work // TODO: make direct block_size work
enum PaletteType { enum PaletteType {
@ -55,7 +54,7 @@ impl ClientPacket for CChunkData<'_> {
palette.iter().for_each(|id| { palette.iter().for_each(|id| {
// Palette // Palette
data_buf.put_var_int(&VarInt(**id as i32)); data_buf.put_var_int(&VarInt(*id as i32));
}); });
// Data array length // Data array length
let data_array_len = chunk.len().div_ceil(64 / block_size as usize); let data_array_len = chunk.len().div_ceil(64 / block_size as usize);
@ -67,7 +66,7 @@ impl ClientPacket for CChunkData<'_> {
for block in block_clump.iter().rev() { for block in block_clump.iter().rev() {
let index = palette let index = palette
.iter() .iter()
.position(|b| *b == block) .position(|b| b == block)
.expect("Its just got added, ofc it should be there"); .expect("Its just got added, ofc it should be there");
out_long = out_long << block_size | (index as i64); out_long = out_long << block_size | (index as i64);
} }

View File

@ -13,9 +13,3 @@ indexmap = { version = "2.7.0", features = ["serde"] }
serde.workspace = true serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
rayon.workspace = true
num-traits.workspace = true
num-derive.workspace = true
itertools.workspace = true

View File

@ -2,8 +2,6 @@ use super::super::recipe::RecipeType;
use super::read::{ use super::read::{
ingredients::IngredientSlot, CraftingType, RecipeKeys, RecipeResult, RecipeTrait, ingredients::IngredientSlot, CraftingType, RecipeKeys, RecipeResult, RecipeTrait,
}; };
use itertools::Itertools;
pub struct ShapedCrafting { pub struct ShapedCrafting {
keys: RecipeKeys, keys: RecipeKeys,
pattern: [[Option<char>; 3]; 3], pattern: [[Option<char>; 3]; 3],
@ -85,7 +83,7 @@ impl RecipeTrait for ShapelessCrafting {
[v1, v2, v3] [v1, v2, v3]
}) })
.collect_vec() .collect()
} }
fn result(self) -> RecipeResult { fn result(self) -> RecipeResult {

View File

@ -11,16 +11,13 @@ pumpkin-macros = { path = "../pumpkin-macros" }
tokio.workspace = true tokio.workspace = true
rayon.workspace = true rayon.workspace = true
derive_more.workspace = true derive_more.workspace = true
itertools.workspace = true
thiserror.workspace = true thiserror.workspace = true
serde.workspace = true serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
log.workspace = true log.workspace = true
parking_lot.workspace = true
num-traits.workspace = true num-traits.workspace = true
num-derive.workspace = true num-derive.workspace = true
futures = "0.3"
dashmap = "6.1.0" dashmap = "6.1.0"
# Compression # Compression
@ -28,7 +25,6 @@ flate2 = "1.0"
lz4 = "1.28.0" lz4 = "1.28.0"
enum_dispatch = "0.3.13" enum_dispatch = "0.3.13"
derive-getters = "0.5.0"
fastnbt = { git = "https://github.com/owengage/fastnbt.git" } fastnbt = { git = "https://github.com/owengage/fastnbt.git" }
@ -39,7 +35,6 @@ rand = "0.8.5"
[dev-dependencies] [dev-dependencies]
criterion = { version = "0.5.1", features = ["html_reports"] } criterion = { version = "0.5.1", features = ["html_reports"] }
[[bench]] [[bench]]
name = "chunk_noise" name = "chunk_noise"
harness = false harness = false

View File

@ -4,7 +4,6 @@ use std::{
}; };
use flate2::bufread::{GzDecoder, ZlibDecoder}; use flate2::bufread::{GzDecoder, ZlibDecoder};
use itertools::Itertools;
use crate::level::SaveFile; use crate::level::SaveFile;
@ -143,7 +142,7 @@ impl ChunkReader for AnvilChunkReader {
}; };
// TODO: check checksum to make sure chunk is not corrupted // TODO: check checksum to make sure chunk is not corrupted
let header = file_buf.drain(0..5).collect_vec(); let header: Vec<u8> = file_buf.drain(0..5).collect();
let compression = Compression::from_byte(header[4]).ok_or( let compression = Compression::from_byte(header[4]).ok_or(
ChunkReadingError::Compression(CompressionError::UnknownCompression), ChunkReadingError::Compression(CompressionError::UnknownCompression),
@ -152,7 +151,7 @@ impl ChunkReader for AnvilChunkReader {
let size = u32::from_be_bytes(header[..4].try_into().unwrap()); let size = u32::from_be_bytes(header[..4].try_into().unwrap());
// size includes the compression scheme byte, so we need to subtract 1 // size includes the compression scheme byte, so we need to subtract 1
let chunk_data = file_buf.drain(0..size as usize - 1).collect_vec(); let chunk_data = file_buf.drain(0..size as usize - 1).collect();
let decompressed_chunk = compression let decompressed_chunk = compression
.decompress_data(chunk_data) .decompress_data(chunk_data)
.map_err(ChunkReadingError::Compression)?; .map_err(ChunkReadingError::Compression)?;

View File

@ -1,4 +1,3 @@
use itertools::Itertools;
use pumpkin_core::math::vector2::Vector2; use pumpkin_core::math::vector2::Vector2;
#[derive(Debug, Clone, Copy, PartialEq)] #[derive(Debug, Clone, Copy, PartialEq)]
@ -76,7 +75,7 @@ impl Cylindrical {
all_chunks all_chunks
.into_iter() .into_iter()
.filter(|chunk| self.is_within_distance(chunk.x, chunk.z)) .filter(|chunk| self.is_within_distance(chunk.x, chunk.z))
.collect_vec() .collect()
} }
} }

View File

@ -1,7 +1,6 @@
use std::{marker::PhantomData, sync::Arc}; use std::{marker::PhantomData, sync::Arc};
use enum_dispatch::enum_dispatch; use enum_dispatch::enum_dispatch;
use itertools::Itertools;
use crate::world_gen::noise::lerp; use crate::world_gen::noise::lerp;
@ -302,13 +301,13 @@ impl<E: DensityFunctionEnvironment, R: ComponentReference<E>> MutableSpline<E, R
.iter() .iter()
.all(|point| matches!(point, SplinePoint::Immutable(_))) .all(|point| matches!(point, SplinePoint::Immutable(_)))
{ {
let immutable_points = converted_points let immutable_points: Vec<ImmutablePoint> = converted_points
.into_iter() .into_iter()
.map(|point| match point { .map(|point| match point {
SplinePoint::Immutable(point) => point, SplinePoint::Immutable(point) => point,
_ => unreachable!(), _ => unreachable!(),
}) })
.collect_vec(); .collect();
SplineRef::Immutable( SplineRef::Immutable(
ImmutableSpline { ImmutableSpline {
function: shared, function: shared,
@ -387,7 +386,7 @@ impl<E: DensityFunctionEnvironment, R: ComponentReference<E>> MutableSplineImpl<
let converted_points = points let converted_points = points
.into_iter() .into_iter()
.map(|point| point.convert(converter)) .map(|point| point.convert(converter))
.collect_vec(); .collect();
Self::create_new_spline(converted_base, converted_points) Self::create_new_spline(converted_base, converted_points)
} }
@ -398,7 +397,7 @@ impl<E: DensityFunctionEnvironment, R: ComponentReference<E>> MutableSplineImpl<
.points .points
.iter() .iter()
.map(|point| point.clone_to_new_point()) .map(|point| point.clone_to_new_point())
.collect_vec(); .collect();
Self::create_new_spline(cloned_function, cloned_points) Self::create_new_spline(cloned_function, cloned_points)
} }
@ -462,18 +461,18 @@ impl ImmutableSplineRef {
converter: &mut dyn ConverterImpl<E>, converter: &mut dyn ConverterImpl<E>,
) -> Option<SplineRef<E>> { ) -> Option<SplineRef<E>> {
let converted_base = self.0.function.maybe_convert(converter); let converted_base = self.0.function.maybe_convert(converter);
let maybe_converted_points = self let maybe_converted_points: Vec<Option<SplinePoint<E>>> = self
.0 .0
.points .points
.iter() .iter()
.map(|point| point.maybe_convert(converter)) .map(|point| point.maybe_convert(converter))
.collect_vec(); .collect();
if converted_base.is_none() && maybe_converted_points.iter().all(|point| point.is_none()) { if converted_base.is_none() && maybe_converted_points.iter().all(|point| point.is_none()) {
None None
} else { } else {
let converted_base = converted_base.unwrap_or_else(|| self.0.function.clone().into()); let converted_base = converted_base.unwrap_or_else(|| self.0.function.clone().into());
let converted_points = maybe_converted_points let converted_points: Vec<SplinePoint<E>> = maybe_converted_points
.into_iter() .into_iter()
.enumerate() .enumerate()
.map(|(index, point)| { .map(|(index, point)| {
@ -483,7 +482,7 @@ impl ImmutableSplineRef {
self.0.points[index].clone().into() self.0.points[index].clone().into()
} }
}) })
.collect_vec(); .collect();
Some(match converted_base { Some(match converted_base {
ComponentReferenceImplementation::Shared(shared) => { ComponentReferenceImplementation::Shared(shared) => {
@ -491,13 +490,13 @@ impl ImmutableSplineRef {
.iter() .iter()
.all(|point| matches!(point, SplinePoint::Immutable(_))) .all(|point| matches!(point, SplinePoint::Immutable(_)))
{ {
let immutable_points = converted_points let immutable_points: Vec<ImmutablePoint> = converted_points
.into_iter() .into_iter()
.map(|point| match point { .map(|point| match point {
SplinePoint::Immutable(point) => point, SplinePoint::Immutable(point) => point,
_ => unreachable!(), _ => unreachable!(),
}) })
.collect_vec(); .collect();
SplineRef::Immutable( SplineRef::Immutable(
ImmutableSpline { ImmutableSpline {
function: shared, function: shared,

View File

@ -1,6 +1,5 @@
use std::sync::Arc; use std::sync::Arc;
use itertools::{izip, Itertools};
use num_traits::Pow; use num_traits::Pow;
use pumpkin_core::random::RandomGenerator; use pumpkin_core::random::RandomGenerator;
@ -226,19 +225,6 @@ impl OctavePerlinNoiseSampler {
random.skip(262); random.skip(262);
} }
} }
#[cfg(debug_assertions)]
{
use itertools::Itertools;
use num_traits::Zero;
if let Ok(length1) = samplers.iter().filter(|x| x.is_some()).try_len() {
if let Ok(length2) = amplitudes.iter().filter(|x| !x.is_zero()).try_len() {
assert_eq!(length1, length2);
}
}
assert!(j >= i as i32 - 1);
}
} else { } else {
let splitter = random.next_splitter(); let splitter = random.next_splitter();
for k in 0..i { for k in 0..i {
@ -256,20 +242,20 @@ impl OctavePerlinNoiseSampler {
let mut lacunarity = 2f64.pow((-j) as f64); let mut lacunarity = 2f64.pow((-j) as f64);
let max_value = Self::get_total_amplitude(2f64, persistence, amplitudes); let max_value = Self::get_total_amplitude(2f64, persistence, amplitudes);
let persistences = (0..amplitudes.len()) let persistences: Vec<f64> = (0..amplitudes.len())
.map(|_| { .map(|_| {
let result = persistence; let result = persistence;
persistence /= 2f64; persistence /= 2f64;
result result
}) })
.collect_vec(); .collect();
let lacunarities = (0..amplitudes.len()) let lacunarities: Vec<f64> = (0..amplitudes.len())
.map(|_| { .map(|_| {
let result = lacunarity; let result = lacunarity;
lacunarity *= 2f64; lacunarity *= 2f64;
result result
}) })
.collect_vec(); .collect();
Self { Self {
octave_samplers: samplers.into(), octave_samplers: samplers.into(),
@ -284,13 +270,13 @@ impl OctavePerlinNoiseSampler {
pub fn sample(&self, x: f64, y: f64, z: f64) -> f64 { pub fn sample(&self, x: f64, y: f64, z: f64) -> f64 {
let mut d = 0f64; let mut d = 0f64;
for (sampler, amplitude, persistence, lacunarity) in izip!( let num_octaves = self.octave_samplers.len();
&self.octave_samplers, for i in 0..num_octaves {
&self.amplitudes, if let Some(sampler) = &self.octave_samplers[i] {
&self.persistences, let lacunarity = self.lacunarities[i];
&self.lacunarities let amplitude = self.amplitudes[i];
) { let persistence = self.persistences[i];
if let Some(sampler) = sampler {
let g = sampler.sample_no_fade( let g = sampler.sample_no_fade(
Self::maintain_precision(x * lacunarity), Self::maintain_precision(x * lacunarity),
Self::maintain_precision(y * lacunarity), Self::maintain_precision(y * lacunarity),

View File

@ -216,7 +216,6 @@ impl ProtoChunk {
mod test { mod test {
use std::{fs, path::Path}; use std::{fs, path::Path};
use itertools::Itertools;
use pumpkin_core::math::vector2::Vector2; use pumpkin_core::math::vector2::Vector2;
use crate::read_data_from_file; use crate::read_data_from_file;
@ -235,7 +234,7 @@ mod test {
.flat_block_map .flat_block_map
.into_iter() .into_iter()
.map(|state| state.state_id) .map(|state| state.state_id)
.collect_vec() .collect::<Vec<u16>>()
); );
} }
@ -252,7 +251,7 @@ mod test {
.flat_block_map .flat_block_map
.into_iter() .into_iter()
.map(|state| state.state_id) .map(|state| state.state_id)
.collect_vec() .collect::<Vec<u16>>()
); );
} }
} }

View File

@ -21,7 +21,6 @@ pumpkin-protocol = { path = "../pumpkin-protocol" }
pumpkin-registry = { path = "../pumpkin-registry" } pumpkin-registry = { path = "../pumpkin-registry" }
pumpkin-macros = { path = "../pumpkin-macros" } pumpkin-macros = { path = "../pumpkin-macros" }
itertools.workspace = true
log.workspace = true log.workspace = true
crossbeam.workspace = true crossbeam.workspace = true
uuid.workspace = true uuid.workspace = true
@ -31,7 +30,6 @@ thiserror.workspace = true
num-traits.workspace = true num-traits.workspace = true
num-derive.workspace = true num-derive.workspace = true
parking_lot.workspace = true
# config # config
serde.workspace = true serde.workspace = true
@ -56,14 +54,14 @@ reqwest = { version = "0.12.9", default-features = false, features = [
] } ] }
sha1 = "0.10.6" sha1 = "0.10.6"
digest = "=0.11.0-pre.9"
# velocity en # velocity en
hmac = "0.12.1" hmac = "0.12.1"
sha2 = "0.10.8" sha2 = "0.10.8"
# icon loading
base64 = "0.22.1" base64 = "0.22.1"
# icon loading
png = "0.17.15" png = "0.17.15"
# logging # logging

View File

@ -1,6 +1,5 @@
use crate::entity::player::Player; use crate::entity::player::Player;
use crate::server::Server; use crate::server::Server;
use itertools::Itertools;
use pumpkin_core::text::TextComponent; use pumpkin_core::text::TextComponent;
use pumpkin_core::GameMode; use pumpkin_core::GameMode;
use pumpkin_inventory::container_click::{ use pumpkin_inventory::container_click::{
@ -59,11 +58,11 @@ impl Player {
let container = OptionallyCombinedContainer::new(&mut inventory, container); let container = OptionallyCombinedContainer::new(&mut inventory, container);
let slots = container let slots: Vec<Slot> = container
.all_slots_ref() .all_slots_ref()
.into_iter() .into_iter()
.map(Slot::from) .map(Slot::from)
.collect_vec(); .collect();
let carried_item = self let carried_item = self
.carried_item .carried_item
@ -462,7 +461,7 @@ impl Player {
} }
async fn get_current_players_in_container(&self, server: &Server) -> Vec<Arc<Self>> { async fn get_current_players_in_container(&self, server: &Server) -> Vec<Arc<Self>> {
let player_ids = { let player_ids: Vec<i32> = {
let open_containers = server.open_containers.read().await; let open_containers = server.open_containers.read().await;
open_containers open_containers
.get(&self.open_container.load().unwrap()) .get(&self.open_container.load().unwrap())
@ -470,7 +469,7 @@ impl Player {
.all_player_ids() .all_player_ids()
.into_iter() .into_iter()
.filter(|player_id| *player_id != self.entity_id()) .filter(|player_id| *player_id != self.entity_id())
.collect_vec() .collect()
}; };
let player_token = self.gameprofile.id; let player_token = self.gameprofile.id;
@ -493,7 +492,7 @@ impl Player {
player_ids.contains(&entity_id).then(|| player.clone()) player_ids.contains(&entity_id).then(|| player.clone())
} }
}) })
.collect_vec(); .collect();
players players
} }

View File

@ -1,7 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use async_trait::async_trait; use async_trait::async_trait;
use itertools::Itertools;
use pumpkin_config::BASIC_CONFIG; use pumpkin_config::BASIC_CONFIG;
use pumpkin_core::text::TextComponent; use pumpkin_core::text::TextComponent;
@ -35,10 +34,7 @@ impl CommandExecutor for ListExecutor {
"There are {} of a max of {} players online: {}", "There are {} of a max of {} players online: {}",
players.len(), players.len(),
BASIC_CONFIG.max_players, BASIC_CONFIG.max_players,
players get_player_names(players)
.iter()
.map(|player| &player.gameprofile.name)
.join(", ")
) )
}; };
@ -48,6 +44,17 @@ impl CommandExecutor for ListExecutor {
} }
} }
fn get_player_names(players: Vec<Arc<Player>>) -> String {
let mut names = String::new();
for player in players {
if !names.is_empty() {
names.push_str(", ");
}
names.push_str(&player.gameprofile.name);
}
names
}
pub fn init_command_tree<'a>() -> CommandTree<'a> { pub fn init_command_tree<'a>() -> CommandTree<'a> {
CommandTree::new(NAMES, DESCRIPTION).execute(&ListExecutor) CommandTree::new(NAMES, DESCRIPTION).execute(&ListExecutor)
} }

View File

@ -9,7 +9,6 @@ use crate::{
error::PumpkinError, error::PumpkinError,
server::Server, server::Server,
}; };
use itertools::Itertools;
use level_time::LevelTime; use level_time::LevelTime;
use pumpkin_config::BasicConfiguration; use pumpkin_config::BasicConfiguration;
use pumpkin_core::math::vector2::Vector2; use pumpkin_core::math::vector2::Vector2;
@ -224,11 +223,7 @@ impl World {
server: &Server, server: &Server,
) { ) {
let command_dispatcher = &server.command_dispatcher; let command_dispatcher = &server.command_dispatcher;
let dimensions = &server let dimensions: Vec<&str> = server.dimensions.iter().map(DimensionType::name).collect();
.dimensions
.iter()
.map(DimensionType::name)
.collect_vec();
// This code follows the vanilla packet order // This code follows the vanilla packet order
let entity_id = player.entity_id(); let entity_id = player.entity_id();
@ -245,7 +240,7 @@ impl World {
.send_packet(&CLogin::new( .send_packet(&CLogin::new(
entity_id, entity_id,
base_config.hardcore, base_config.hardcore,
dimensions, &dimensions,
base_config.max_players.into(), base_config.max_players.into(),
base_config.view_distance.into(), // TODO: view distance base_config.view_distance.into(), // TODO: view distance
base_config.simulation_distance.into(), // TODO: sim view dinstance base_config.simulation_distance.into(), // TODO: sim view dinstance