diff --git a/Cargo.lock b/Cargo.lock
index 024eb4021..2f7d8207a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1390,10 +1390,6 @@ dependencies = [
"either",
]
-[[package]]
-name = "iterutil"
-version = "0.0.94"
-
[[package]]
name = "itoa"
version = "1.0.10"
@@ -2269,7 +2265,6 @@ dependencies = [
"half",
"hashbrown 0.14.5",
"indexmap",
- "iterutil",
"num",
"num-traits",
"num_cpus",
@@ -2288,6 +2283,7 @@ dependencies = [
"serde_json",
"similar-asserts",
"smallvec",
+ "stdutil",
"strsim",
"textwrap",
"tokio",
@@ -3036,6 +3032,10 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+[[package]]
+name = "stdutil"
+version = "0.0.94"
+
[[package]]
name = "stringprep"
version = "0.1.5"
diff --git a/crates/rayexec_execution/Cargo.toml b/crates/rayexec_execution/Cargo.toml
index f895cb44a..bb23dab95 100644
--- a/crates/rayexec_execution/Cargo.toml
+++ b/crates/rayexec_execution/Cargo.toml
@@ -10,7 +10,7 @@ rayexec_parser = { path = "../rayexec_parser" }
# rayexec_bullet = { path = "../rayexec_bullet" }
rayexec_io = { path = "../rayexec_io" }
fmtutil = { path = "../fmtutil" }
-iterutil = { path = "../iterutil" }
+stdutil = { path = "../stdutil" }
# stackutil = { path = "../stackutil" } TODO: psm hash issues when compiling to wasm on macos
ahash = { workspace = true }
diff --git a/crates/rayexec_execution/src/arrays/array/exp.rs b/crates/rayexec_execution/src/arrays/array/exp.rs
index 3e106d0ba..adee68af3 100644
--- a/crates/rayexec_execution/src/arrays/array/exp.rs
+++ b/crates/rayexec_execution/src/arrays/array/exp.rs
@@ -1,6 +1,6 @@
use half::f16;
-use iterutil::{IntoExactSizeIterator, TryFromExactSizeIterator};
use rayexec_error::{not_implemented, RayexecError, Result};
+use stdutil::iter::{IntoExactSizeIterator, TryFromExactSizeIterator};
use super::array_data::ArrayData;
use super::flat::FlatArrayView;
diff --git a/crates/rayexec_execution/src/arrays/batch_exp.rs b/crates/rayexec_execution/src/arrays/batch_exp.rs
index 7405a372e..0888785ff 100644
--- a/crates/rayexec_execution/src/arrays/batch_exp.rs
+++ b/crates/rayexec_execution/src/arrays/batch_exp.rs
@@ -1,5 +1,5 @@
-use iterutil::IntoExactSizeIterator;
use rayexec_error::{RayexecError, Result};
+use stdutil::iter::IntoExactSizeIterator;
use super::array::exp::Array;
use super::array::selection::Selection;
@@ -139,7 +139,7 @@ where
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
diff --git a/crates/rayexec_execution/src/arrays/compute/cast/array.rs b/crates/rayexec_execution/src/arrays/compute/cast/array.rs
index 2de9f9731..2156a127f 100644
--- a/crates/rayexec_execution/src/arrays/compute/cast/array.rs
+++ b/crates/rayexec_execution/src/arrays/compute/cast/array.rs
@@ -1,6 +1,6 @@
use std::ops::Mul;
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use num::{CheckedDiv, CheckedMul, Float, NumCast, PrimInt, ToPrimitive};
use rayexec_error::{RayexecError, Result};
@@ -840,7 +840,7 @@ where
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::datatype::DecimalTypeMeta;
diff --git a/crates/rayexec_execution/src/arrays/compute/date.rs b/crates/rayexec_execution/src/arrays/compute/date.rs
index 255fec887..a9c4213a1 100644
--- a/crates/rayexec_execution/src/arrays/compute/date.rs
+++ b/crates/rayexec_execution/src/arrays/compute/date.rs
@@ -1,5 +1,5 @@
use chrono::{DateTime, Datelike, NaiveDate, Timelike, Utc};
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use rayexec_error::{not_implemented, RayexecError, Result};
use crate::arrays::array::exp::Array;
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/aggregate/binary.rs b/crates/rayexec_execution/src/arrays/executor_exp/aggregate/binary.rs
index 71d1c6b0e..139cb5652 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/aggregate/binary.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/aggregate/binary.rs
@@ -1,5 +1,5 @@
-use iterutil::IntoExactSizeIterator;
use rayexec_error::Result;
+use stdutil::iter::IntoExactSizeIterator;
use super::AggregateState;
use crate::arrays::array::exp::Array;
@@ -62,7 +62,7 @@ impl BinaryNonNullUpdater {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::buffer::physical_type::{AddressableMut, PhysicalI32};
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/aggregate/mod.rs b/crates/rayexec_execution/src/arrays/executor_exp/aggregate/mod.rs
index f836c670d..443ad1874 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/aggregate/mod.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/aggregate/mod.rs
@@ -40,6 +40,7 @@ impl StateCombiner {
) -> Result<()>
where
State: AggregateState,
+ Output: ?Sized,
{
for (from, to) in mapping {
let consume = &mut consume[from];
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/aggregate/unary.rs b/crates/rayexec_execution/src/arrays/executor_exp/aggregate/unary.rs
index 2532e9d65..463b568af 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/aggregate/unary.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/aggregate/unary.rs
@@ -1,5 +1,5 @@
-use iterutil::IntoExactSizeIterator;
use rayexec_error::Result;
+use stdutil::iter::IntoExactSizeIterator;
use super::AggregateState;
use crate::arrays::array::exp::Array;
@@ -94,7 +94,7 @@ impl UnaryNonNullUpdater {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::buffer::buffer_manager::NopBufferManager;
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/scalar/binary.rs b/crates/rayexec_execution/src/arrays/executor_exp/scalar/binary.rs
index 3764884f1..894a56487 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/scalar/binary.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/scalar/binary.rs
@@ -1,4 +1,4 @@
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use rayexec_error::Result;
use crate::arrays::array::exp::Array;
@@ -144,7 +144,7 @@ impl BinaryExecutor {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::array::validity::Validity;
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/scalar/list_reduce.rs b/crates/rayexec_execution/src/arrays/executor_exp/scalar/list_reduce.rs
index a1860e6e2..c552c0161 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/scalar/list_reduce.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/scalar/list_reduce.rs
@@ -1,4 +1,4 @@
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use rayexec_error::{RayexecError, Result};
use crate::arrays::array::exp::Array;
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/scalar/ternary.rs b/crates/rayexec_execution/src/arrays/executor_exp/scalar/ternary.rs
index 179be7a19..49599c903 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/scalar/ternary.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/scalar/ternary.rs
@@ -1,4 +1,4 @@
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use rayexec_error::Result;
use crate::arrays::array::exp::Array;
@@ -189,7 +189,7 @@ impl TernaryExecutor {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::buffer::buffer_manager::NopBufferManager;
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/scalar/unary.rs b/crates/rayexec_execution/src/arrays/executor_exp/scalar/unary.rs
index 67f6a39cc..3e2f62a92 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/scalar/unary.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/scalar/unary.rs
@@ -1,5 +1,5 @@
-use iterutil::IntoExactSizeIterator;
use rayexec_error::Result;
+use stdutil::iter::IntoExactSizeIterator;
use crate::arrays::array::exp::Array;
use crate::arrays::array::flat::FlatArrayView;
@@ -179,7 +179,7 @@ impl UnaryExecutor {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::array::validity::Validity;
diff --git a/crates/rayexec_execution/src/arrays/executor_exp/scalar/uniform.rs b/crates/rayexec_execution/src/arrays/executor_exp/scalar/uniform.rs
index 08092741a..d45f71741 100644
--- a/crates/rayexec_execution/src/arrays/executor_exp/scalar/uniform.rs
+++ b/crates/rayexec_execution/src/arrays/executor_exp/scalar/uniform.rs
@@ -1,4 +1,4 @@
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use rayexec_error::Result;
use crate::arrays::array::exp::Array;
@@ -149,7 +149,7 @@ impl UniformExecutor {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::buffer::buffer_manager::NopBufferManager;
diff --git a/crates/rayexec_execution/src/arrays/testutil.rs b/crates/rayexec_execution/src/arrays/testutil.rs
index 8492dc81f..988e760ec 100644
--- a/crates/rayexec_execution/src/arrays/testutil.rs
+++ b/crates/rayexec_execution/src/arrays/testutil.rs
@@ -8,7 +8,7 @@
use std::collections::BTreeMap;
use std::fmt::Debug;
-use iterutil::IntoExactSizeIterator;
+use stdutil::iter::IntoExactSizeIterator;
use super::array::exp::Array;
use super::batch_exp::Batch;
@@ -201,7 +201,7 @@ pub fn assert_batches_eq(batch1: &Batch, batch2: &Batch) {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::buffer::buffer_manager::NopBufferManager;
diff --git a/crates/rayexec_execution/src/expr/physical/case_expr.rs b/crates/rayexec_execution/src/expr/physical/case_expr.rs
index 45b74cafe..48a4c78b4 100644
--- a/crates/rayexec_execution/src/expr/physical/case_expr.rs
+++ b/crates/rayexec_execution/src/expr/physical/case_expr.rs
@@ -187,7 +187,7 @@ impl fmt::Display for PhysicalCaseExpr {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::datatype::DataType;
diff --git a/crates/rayexec_execution/src/expr/physical/cast_expr.rs b/crates/rayexec_execution/src/expr/physical/cast_expr.rs
index 2c4a56c41..729e3f7e8 100644
--- a/crates/rayexec_execution/src/expr/physical/cast_expr.rs
+++ b/crates/rayexec_execution/src/expr/physical/cast_expr.rs
@@ -101,7 +101,7 @@ impl DatabaseProtoConv for PhysicalCastExpr {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::buffer::buffer_manager::NopBufferManager;
diff --git a/crates/rayexec_execution/src/expr/physical/column_expr.rs b/crates/rayexec_execution/src/expr/physical/column_expr.rs
index 6280eabb0..40537bc5f 100644
--- a/crates/rayexec_execution/src/expr/physical/column_expr.rs
+++ b/crates/rayexec_execution/src/expr/physical/column_expr.rs
@@ -70,7 +70,7 @@ impl DatabaseProtoConv for PhysicalColumnExpr {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::datatype::DataType;
diff --git a/crates/rayexec_execution/src/expr/physical/literal_expr.rs b/crates/rayexec_execution/src/expr/physical/literal_expr.rs
index f220d8fbe..a35bced6e 100644
--- a/crates/rayexec_execution/src/expr/physical/literal_expr.rs
+++ b/crates/rayexec_execution/src/expr/physical/literal_expr.rs
@@ -68,7 +68,7 @@ impl DatabaseProtoConv for PhysicalLiteralExpr {
#[cfg(test)]
mod tests {
- use iterutil::TryFromExactSizeIterator;
+ use stdutil::iter::TryFromExactSizeIterator;
use super::*;
use crate::arrays::datatype::DataType;
diff --git a/crates/rayexec_execution/src/functions/aggregate/states.rs b/crates/rayexec_execution/src/functions/aggregate/states.rs
index f1416fc07..808218e32 100644
--- a/crates/rayexec_execution/src/functions/aggregate/states.rs
+++ b/crates/rayexec_execution/src/functions/aggregate/states.rs
@@ -3,8 +3,9 @@ use std::any::Any;
use std::fmt::Debug;
use std::marker::PhantomData;
-use iterutil::IntoExactSizeIterator;
use rayexec_error::{RayexecError, Result};
+use stdutil::iter::IntoExactSizeIterator;
+use stdutil::marker::PhantomCovariant;
use super::ChunkGroupAddressIter;
use crate::arrays::array::exp::Array;
@@ -32,7 +33,14 @@ use crate::arrays::executor_exp::aggregate::{AggregateState, StateCombiner};
use crate::arrays::executor_exp::PutBuffer;
use crate::arrays::storage::{AddressableStorage, PrimitiveStorage};
-pub struct TypedAggregateGroupStates {
+pub struct TypedAggregateGroupStates<
+ State,
+ Input,
+ Output: ?Sized,
+ StateInit,
+ StateUpdate,
+ StateFinalize,
+> {
/// States being tracked.
states: Vec,
@@ -47,11 +55,11 @@ pub struct TypedAggregateGroupStates,
- _output: PhantomData