From 6deeb1e7b562288d44631d349e203d659ad8e3f7 Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Mon, 8 Mar 2021 22:02:59 +0700
Subject: [PATCH 1/8] Structural changes

---
 .gitignore         |   8 ++
 CODE_OF_CONDUCT.md | 129 +++++++++++++++++++++
 CONTRIBUTING.md    |   5 +
 Cargo.toml         |  19 +++
 README.md          |  50 +++++++-
 SECURITY.md        |  13 +++
 TODO.md            |   0
 src/collection.rs  |  79 +++++++++++++
 src/collumn.rs     | 169 +++++++++++++++++++++++++++
 src/lib.rs         | 280 +++++++++++++++++++++++++++++++++++++++++++++
 src/row.rs         | 220 +++++++++++++++++++++++++++++++++++
 11 files changed, 971 insertions(+), 1 deletion(-)
 create mode 100644 CODE_OF_CONDUCT.md
 create mode 100644 CONTRIBUTING.md
 create mode 100644 Cargo.toml
 create mode 100644 SECURITY.md
 create mode 100644 TODO.md
 create mode 100644 src/collection.rs
 create mode 100644 src/collumn.rs
 create mode 100644 src/lib.rs
 create mode 100644 src/row.rs

diff --git a/.gitignore b/.gitignore
index 088ba6b..1720240 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,11 @@ Cargo.lock
 
 # These are backup files generated by rustfmt
 **/*.rs.bk
+
+
+# Added by cargo
+#
+# already existing elements were commented out
+
+/target
+#Cargo.lock
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..8dea5d4
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,129 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+  and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+  overall community
+* Accepting and using the preferred gender pronouns of all people who have specified them involved in the project.
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+  advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+  address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement by emailing
+`dudochkin.victor@gmail.com`.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior,  harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..c2daa99
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,5 @@
+# Contributing to Angular Rust
+
+Want to contribute to Angular Rust? There are a few things you need to know.  
+
+We wrote a **[contribution guide](https://angular-rust.github.io/contributing/)** to help you get started.
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..1838d22
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "ux-dataflow"
+version = "0.1.0"
+authors = ["Victor Dudochkin <dudochkin.victor@gmail.com>", "Maksim Makarov <pr0n1x@yandex.ru>"]
+readme = "README.md"
+homepage = "https://angular-rust.github.io/ux-dataflow"
+repository = "https://github.com/angular-rust/ux-dataflow"
+documentation = "https://docs.rs/ux-dataflow"
+description = "Data Processing Library"
+keywords = ["datatable", "dataframe", "datastream", "data-structures"]
+categories = ["data-structures"]
+edition = "2018"
+license = "MPL-2.0"
+
+[badges]
+maintenance = { status = "actively-developed" }
+
+[dependencies]
+intmap = "0.7"
\ No newline at end of file
diff --git a/README.md b/README.md
index 6c1fd32..385970b 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,49 @@
-# ux-dataflow
\ No newline at end of file
+# UX DataFlow
+
+[![API Docs][docrs-badge]][docrs-url]
+[![Crates.io][crates-badge]][crates-url]
+[![MPL-2.0 licensed][license-badge]][license-url]
+[![Gitter chat][gitter-badge]][gitter-url]
+[![Rustc Version 1.45+][rust-badge]][rust-url]
+
+[docrs-badge]: https://img.shields.io/docsrs/ux-dataflow?style=flat-square
+[docrs-url]: https://docs.rs/ux-dataflow/
+[crates-badge]: https://img.shields.io/crates/v/ux-dataflow.svg?style=flat-square
+[crates-url]: https://crates.io/crates/ux-dataflow
+[license-badge]: https://img.shields.io/badge/license-MPL--2.0-blue.svg?style=flat-square
+[license-url]: https://github.com/angular-rust/ux-dataflow/blob/master/LICENSE
+[gitter-badge]: https://img.shields.io/gitter/room/angular_rust/angular_rust.svg?style=flat-square
+[gitter-url]: https://gitter.im/angular_rust/angular_rust
+[rust-badge]: https://img.shields.io/badge/rustc-1.45-lightgrey.svg?style=flat-square
+[rust-url]: https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html
+
+Angular Rust is a high productivity, frontend web framework for the [Rust language](https://www.rust-lang.org/).
+
+Current Version: 0.1.0 (2021-03-01)
+
+## Quick Start
+
+Install Angular Rust:
+
+	cargo add ux-dataflow
+
+## Community
+
+* [Gitter](https://gitter.im/angular_rust/community)
+* [StackOverflow](https://stackoverflow.com/questions/tagged/angular-rust)
+
+
+## Learn More
+
+* [Manual, Samples, Docs, etc](https://angular-rust.github.io/)
+* [Apps using Angular Rust](https://github.com/angular-rust/ux-dataflow/wiki/Apps-in-the-Wild)
+* [Articles Featuring Angular Rust](https://github.com/angular-rust/ux-dataflow/wiki/Articles)
+
+## Bugs ##
+If you find an issue, let me know [here](https://github.com/angular-rust/ux-dataflow/issues/new).
+
+## Contributing
+I openly welcome community contributions, including bug fixes and new features. Please feel free to [fork the project](https://github.com/angular-rust/ux-dataflow/fork) and submit a pull request.
+
+* [Contributing Code Guidelines](https://github.com/angular-rust/ux-dataflow/blob/main/CONTRIBUTING.md)
+* [Angular Rust Contributors](https://github.com/angular-rust/ux-dataflow/graphs/contributors)
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..c30ff81
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,13 @@
+# Security Policy
+
+If you believe you have found a security vulnerability in Angular Rust, we encourage you to let us know right away. We will investigate all legitimate reports and do our best to quickly fix the problem.
+
+## Reporting a Vulnerability
+
+To report a security vulnerability, please create a Github issue [here](https://github.com/angular-rust/ux-dataflow/issues/new).
+
+If you can, please include the following details:
+* An MCVE (minimum complete verifiable example) – this is a short code snippet which demonstrates the error in the 
+the simplest possible (or just a simple) way.
+* Which versions of Angular Rust the vulnerability is present in
+* What effects the vulnerability has and how serious the vulnerability is
\ No newline at end of file
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..e69de29
diff --git a/src/collection.rs b/src/collection.rs
new file mode 100644
index 0000000..a7ccfa3
--- /dev/null
+++ b/src/collection.rs
@@ -0,0 +1,79 @@
+use std::fmt;
+
+use super::TableEntity;
+
+// class DataCollectionIterator<E extends TableEntity> implements Iterator<E> {
+//   let DataCollectionBase<E> iterable;
+//   let i64 length;
+//   i64 index;
+//   E current;
+
+//   DataCollectionIterator(DataCollectionBase<E> iterable)
+//       : iterable = iterable,
+//         length = iterable.length,
+//         index = 0;
+
+//   E get current => current;
+
+//   bool moveNext() {
+//     i64 length = iterable.length;
+//     if (length != length) {
+//       throw ConcurrentModificationError(iterable);
+//     }
+//     if (index >= length) {
+//       current = null;
+//       return false;
+//     }
+//     current = iterable.elementAt(index);
+//     index++;
+//     return true;
+//   }
+// }
+
+trait DataCollectionBase<E>
+where
+    E: TableEntity,
+{
+    fn release_items(&self, start: i64, end: i64);
+
+    fn update_items(&self, start: i64);
+
+    // fn get_iterator() -> Iterator<E> => DataCollectionIterator<E>(this);
+
+    // fn first() -> E  => base.first;
+
+    // fn last() -> E => base.last;
+
+    // fn single() -> E => base.single;
+
+    // fn get_length() -> usize => base.length;
+
+    // fn set length(&self, i64 value);
+
+    // E operator [](i64 index) => base[index];
+
+    // operator []=(i64 index, E value) {
+    //   // TODO: implement.
+    //   throw UnimplementedError();
+    // }
+
+    fn add(&self, value: E);
+
+    // fn add_all(&self, iterable: Iterator<E>);
+
+    // fn elementAt(&self, i64 index) -> E;
+
+    fn insert(&self, index: i64, value: E);
+
+    // fn insert_all(&self, index: i64, iterable: Iterable<E>);
+
+    fn remove(&self, element: E) -> bool;
+
+    fn clear(&self);
+
+    fn remove_at(&self, index: i64) -> E;
+
+    fn remove_last(&self) -> E;
+
+    fn remove_range(&self, start: i64, end: i64);
+}
diff --git a/src/collumn.rs b/src/collumn.rs
new file mode 100644
index 0000000..2d71aae
--- /dev/null
+++ b/src/collumn.rs
@@ -0,0 +1,169 @@
+use super::TableEntity;
+
+pub struct DataColumn<'a> {
+    index: i64,
+    // table: DataTable,
+    /// The name of the column.
+    name: &'a str,
+}
+
+impl<'a> TableEntity for DataColumn<'a> {}
+
+impl<'a> DataColumn<'a> {
+    fn new(name: &'a str) -> Self {
+        Self { index: 0, name }
+    }
+}
+
+// pub struct DataColumnCollection<M, D> 
+// where
+//     M: fmt::Display,
+// {
+//     // base: Vec<DataColumn<'a>>,
+//     // table: DataTable<'a, M, D>,
+// }
+
+// impl<M, D> DataColumnCollection<M, D> 
+// where
+//     M: fmt::Display,
+// {
+//     pub fn new(table: &DataTable<M, D>) -> Self {
+      
+//         Self {
+//             // base: Default::default(),
+//             // table
+//         }
+//     }
+// }
+
+// impl<'a, M, D> DataCollectionBase<DataColumn<'a>> for DataColumnCollection<M, D> 
+// where
+//     M: fmt::Display,
+// {
+//     fn release_items(&self, start: i64, end: i64) {
+//         // while (start < end) {
+//         //   base[start].table = null;
+//         //   start++;
+//         // }
+//         unimplemented!()
+//     }
+
+//     fn update_items(&self, start: i64) {
+//         // let len = length;
+//         // while (start < len) {
+//         //   base[start]
+//         //     ..table = table
+//         //     ..index = start++;
+//         // }
+//         unimplemented!()
+//     }
+
+//     // @override
+//     // Iterator<E> get iterator => DataCollectionIterator<E>(this);
+
+//     // @override
+//     // E get first => base.first;
+
+//     // @override
+//     // E get last => base.last;
+
+//     // @override
+//     // E get single => base.single;
+
+//     // @override
+//     // i64 get length => base.length;
+
+//     // fn set length(&self, i64 value) {
+//     //   // TODO: implement.
+//     //   throw UnimplementedError();
+//     // }
+
+//     // @override
+//     // E operator [](i64 index) => base[index];
+
+//     // @override
+//     // operator []=(i64 index, E value) {
+//     //   // TODO: implement.
+//     //   throw UnimplementedError();
+//     // }
+
+//     fn add(&self, value: DataColumn<'a>) {
+//         // let index = length;
+//         // base.add(value);
+//         // updateItems(index);
+//         // table.onRowsOrColumnsInserted(this, index, 1);
+//         unimplemented!()
+//     }
+
+//     // fn add_all(&self, iterable: Iterator<DataColumn<'a>>) {
+//     // //     // let index = length;
+//     // //     // base.addAll(iterable);
+//     // //     // updateItems(index);
+//     // //     // table.onRowsOrColumnsInserted(this, index, iterable.length);
+//     // }
+
+//     // @override
+//     // E elementAt(&self, i64 index) => base[index];
+
+//     fn insert(&self, index: i64, value: DataColumn<'a>) {
+//         // base.insert(index, value);
+//         // updateItems(index);
+//         // table.onRowsOrColumnsInserted(this, index, 1);
+//         unimplemented!()
+//     }
+
+//     // fn insert_all(&self, index: i64, iterable: Iterable<DataColumn<'a>>) {
+//     //     // base.insertAll(index, iterable);
+//     //     // updateItems(index);
+//     //     // table.onRowsOrColumnsInserted(this, index, iterable.length);
+//     // }
+
+//     fn remove(&self, element: DataColumn<'a>) -> bool {
+//         // let index = base.indexOf(element);
+//         // if (index == -1) return false;
+//         // removeAt(index);
+//         // return true;
+//         unimplemented!()
+//     }
+
+//     fn clear(&self) {
+//         // let len = length;
+//         // if (len == 0) return;
+//         // releaseItems(0, len);
+//         // base.clear();
+//         // table.onRowsOrColumnsRemoved(this, 0, len);
+//         unimplemented!()
+//     }
+
+//     fn remove_at(&self, index: i64) -> DataColumn<'a> {
+//         // let e = base.removeAt(index);
+//         // e.table = null;
+//         // updateItems(index);
+//         // table.onRowsOrColumnsRemoved(this, index, 1);
+//         // return e;
+//         unimplemented!()
+//     }
+
+//     fn remove_last(&self) -> DataColumn<'a> {
+//         // let e = base.removeLast();
+//         // e.table = null;
+//         // table.onRowsOrColumnsRemoved(this, length, 1);
+//         // return e;
+//         unimplemented!()
+//     }
+
+//     fn remove_range(&self, start: i64, end: i64) {
+//         // releaseItems(start, end);
+//         // base.remove_range(start, end);
+//         // updateItems(start);
+//         // table.onRowsOrColumnsRemoved(this, start, end - start);
+//         unimplemented!()
+//     }
+
+//     // DataColumnCollection(DataTable table) : super(table);
+
+//     // /// Adds a new column given its [name] and [type].
+//     // fn add2(&self, name: String, dtype: Type) {
+//     //     // add(DataColumn(name, dtype));
+//     // }
+// }
\ No newline at end of file
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..f469758
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,280 @@
+#![allow(unused_variables)]
+#![allow(unused_imports)]
+#![allow(dead_code)]
+
+use intmap::IntMap;
+use std::{collections::HashMap, fmt};
+
+pub mod row;
+pub mod collumn;
+pub mod collection;
+
+#[derive(Clone, Debug)]
+pub struct Channel<'a> {
+    pub name: &'a str,
+    pub tag: u8,
+    pub visible: bool,
+}
+
+#[derive(Clone, Debug)]
+pub struct DataFrame<M, D>
+where
+    M: fmt::Display,
+{
+    // metric contain something like a timestamp, or month names
+    pub metric: M,
+    // data key is tag for stream meta (a.k.a column tag)
+    // D is
+    pub data: IntMap<D>,
+}
+
+pub struct DataCellChangeRecord<T>
+where
+    T: fmt::Display,
+{
+    pub row_index: i64,
+    pub column_index: i64,
+    pub old_value: T,
+    pub new_value: T,
+}
+
+impl<T> DataCellChangeRecord<T>
+where
+    T: fmt::Display,
+{
+    fn new(row_index: i64, column_index: i64, old_value: T, new_value: T) -> Self {
+        Self {
+            row_index,
+            column_index,
+            old_value,
+            new_value,
+        }
+    }
+}
+
+impl<T> fmt::Display for DataCellChangeRecord<T>
+where
+    T: fmt::Display,
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "DataCellChangeRecord {{ rowIndex: {}, colIndex; {}, {}, {} }}",
+            self.row_index, self.column_index, self.old_value, self.new_value
+        )
+    }
+}
+
+pub struct DataCollectionChangeRecord {
+    pub index: usize,
+    pub added_count: usize,
+    pub removed_count: usize,
+}
+
+impl DataCollectionChangeRecord {
+    fn new(index: usize, added_count: usize, removed_count: usize) -> Self {
+        Self {
+            index,
+            added_count,
+            removed_count,
+        }
+    }
+}
+
+impl fmt::Display for DataCollectionChangeRecord {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "DataCollectionChangeRecord {{ index: {}, added: {}, removed: {} }}",
+            self.index, self.added_count, self.removed_count
+        )
+    }
+}
+
+// should impl getters/setters
+pub trait TableEntity {}
+
+#[derive(Clone)]
+pub struct DataStream<'a, M, D> 
+where
+    M: fmt::Display,
+    D: fmt::Display,
+{
+    pub meta: Vec<Channel<'a>>,
+    // data is renamed to frames
+    pub frames: Vec<DataFrame<M, D>>,
+    // column_index_by_name: HashMap<String, usize>,
+    // columns: Option<DataColumnCollection<M, D>>,
+    // rows: Option<DataRowCollection<M, D>>,
+    // cellChangeController: StreamController<DataCellChangeRecord>,
+    // columnsChangeController: StreamController<DataCollectionChangeRecord>,
+    // rowsChangeController: StreamController<DataCollectionChangeRecord>,
+}
+
+impl<'a, M, D> Default for DataStream<'a, M, D> 
+where
+    M: fmt::Display,
+    D: fmt::Display,
+{
+    fn default() -> Self {
+        Self{
+            meta: Vec::new(),
+            frames: Vec::new(),
+        }
+    }
+}
+
+impl<'a, M, D> DataStream<'a, M, D> 
+where
+    M: fmt::Display,
+    D: fmt::Display,
+{
+    /// Creates a [DataTable] with optional data [data].
+    ///
+    /// * 'metadata' - contains row names
+    ///
+    /// The first row in [data] contains the column names.
+    /// The data type of each column is determined by the first non-null value
+    /// in that column.
+    ///
+    /// All values in each column are expected to be of the same type,
+    /// and all rows are expected to have the same length.
+    // data is optional
+    pub fn new(metadata: Vec<Channel>, data: Vec<DataFrame<M, D>>) -> Self {
+        // let data_table = DataTable {
+        //     // column_index_by_name: Default::default(),
+        //     // columns: None,
+        //     // rows: None,
+        // };
+
+        // let column_index_by_name = HashMap::<String, usize>::new();
+        // let rows: DataRowCollection<String> = DataRowCollection::new(&data_table);
+        // let columns: DataColumnCollection = DataColumnCollection::new(&data_table);
+
+        // let col_count = metadata.len();
+        // let row_count = data.len();
+
+        // // first deal with columns
+        // for col_idx in 0..col_count {
+        //     let name = metadata[col_idx];
+        //     columns.add(DataColumn { index: 0, name });
+        // }
+
+        // rows.add_all(data);
+        unimplemented!()
+    }
+
+    fn on_cell_changed(row_index: i64, column_index: i64, old_value: String, new_value: String) {
+        // if (cellChangeController != null) {
+        //   let record =
+        //       DataCellChangeRecord(rowIndex, columnIndex, oldValue, newValue);
+        //   cellChangeController.add(record);
+        // }
+    }
+
+    // fn onRowsOrColumnsInserted(source: DataCollectionBase, index: i64, count: i64) {
+    //     // let record = DataCollectionChangeRecord(index, count, 0);
+    //     // if (source == columns) {
+    //     //   insertColumns(index, count);
+    //     //   updateColumnIndexes(index);
+    //     //   columnsChangeController?.add(record);
+    //     // } else {
+    //     //   rowsChangeController?.add(record);
+    //     // }
+    // }
+
+    // fn onRowsOrColumnsRemoved(source: DataCollectionBase, index: i64, count: i64) {
+    //     // let record = DataCollectionChangeRecord(index, 0, count);
+    //     // if (source == columns) {
+    //     //   removeColumns(index, count);
+    //     //   updateColumnIndexes(index);
+    //     //   columnsChangeController?.add(record);
+    //     // } else {
+    //     //   rowsChangeController?.add(record);
+    //     // }
+    // }
+
+    fn insert_columns(start: i64, count: i64) {
+        // for (let row in rows) {
+        //   row.cells.insertAll(start, List(count));
+        // }
+    }
+
+    fn remove_columns(start: i64, count: i64) {
+        // for (let row in rows) {
+        //   row.cells.remove_range(start, start + count);
+        // }
+    }
+
+    fn update_column_indexes(start: i64) {
+        // let end = columns.length;
+        // while (start < end) {
+        //   columnIndexByName[_columns[start].name] = start++;
+        // }
+    }
+
+    // /// The columns in this [DataTable].
+    // DataColumnCollection get columns => columns;
+
+    // /// The rows (without the header row) in this [DataTable].
+    // DataRowCollection get rows => rows;
+
+    // /// Fired when a cell is changed.
+    // Stream<DataCellChangeRecord> get onCellChange {
+    // ??= - Assign the value if the variable is null
+    //   cellChangeController ??= StreamController.broadcast(
+    //       sync: true,
+    //       onCancel: () {
+    //         cellChangeController = null;
+    //       });
+    //   return cellChangeController.stream;
+    // }
+
+    // /// Fired when [columns] are changed.
+    // Stream<DataCollectionChangeRecord> get onColumnsChange {
+    // ??= - Assign the value if the variable is null
+    //   columnsChangeController ??= StreamController.broadcast(
+    //       sync: true,
+    //       onCancel: () {
+    //         columnsChangeController = null;
+    //       });
+    //   return columnsChangeController.stream;
+    // }
+
+    // /// Fired when [rows] are changed.
+    // Stream<DataCollectionChangeRecord> get onRowsChange {
+    // ??= - Assign the value if the variable is null
+    //   rowsChangeController ??= StreamController.broadcast(
+    //       sync: true,
+    //       onCancel: () {
+    //         rowsChangeController = null;
+    //       });
+    //   return rowsChangeController.stream;
+    // }
+
+    // /// Gets the index of the column specified by [name].
+    // i64 getColumnIndexByName(String name) {
+    //   if (columnIndexByName.containsKey(name)) {
+    //     return columnIndexByName[name];
+    //   }
+    //   return -1;
+    // }
+
+    // /// Gets the values of the column specified by [columnIndex].
+    // Vec<T> getColumnValues<T>(i64 columnIndex) {
+    //   let list = <T>[];
+    //   for (let row in rows) {
+    //     list.add(row[columnIndex]);
+    //   }
+    //   return list;
+    // }
+}
+
+
+#[cfg(test)]
+mod tests {
+    #[test]
+    fn it_works() {
+        assert_eq!(2 + 2, 4);
+    }
+}
diff --git a/src/row.rs b/src/row.rs
new file mode 100644
index 0000000..a4611be
--- /dev/null
+++ b/src/row.rs
@@ -0,0 +1,220 @@
+use super::TableEntity;
+
+pub struct DataRow<T> {
+    index: i64,
+    // table: DataTable,
+    /// The list that stores the actual data.
+    cells: Vec<T>,
+}
+
+impl<T> TableEntity for DataRow<T> {}
+
+impl<T> DataRow<T> {
+    /// Converts a column index or name to an index.
+    fn to_index(column_index_or_name: i64) -> i64 {
+        // if (columnIndexOrName is int) return columnIndexOrName;
+        // return table.columnIndexByName[columnIndexOrName];
+        unimplemented!()
+    }
+
+    // /// Creates a new [DataRow] from a list of values.
+    // ///
+    // ///  Each value in [values] corresponds to a column. If [values] is too short,
+    // /// the remaining columns are filled with `null`.
+    // DataRow.internal(DataTable table, List values) {
+    //   table = table;
+    //   let n = table.columns.length;
+    //   let m = values.length;
+    //   let min = m;
+    //   if (min > n) min = n;
+    //   cells = values.sublist(0, min);
+    //   for (let i = min; i < n; i++) {
+    //     cells.add(null);
+    //   }
+    // }
+
+    // /// Returns the value of the column specified by [columnIndexOrName].
+    // operator [](columnIndexOrName) => cells[_toIndex(columnIndexOrName)];
+
+    // /// Sets the value of the column specified by [columnIndexOrName].
+    // operator []=(columnIndexOrName, value) {
+    //   let columnIndex = toIndex(columnIndexOrName);
+    //   let oldValue = cells[columnIndex];
+    //   cells[columnIndex] = value;
+    //   table.onCellChanged(index, columnIndex, oldValue, value);
+    // }
+
+    // /// Creates a [List] containing all cells in this [DataRow].
+    // List toList({bool growable: true}) => cells.toList(growable: growable);
+}
+
+// pub struct DataRowCollection<M, D> {
+//     base: Vec<DataRow<D>>,
+//     //     table: DataTable,
+// }
+
+// impl<M, D> DataRowCollection<M, D> {
+//     pub fn new(table: &DataTable<M, D>) -> Self {
+//         //   table = table;
+//         Self {
+//             base: Default::default(),
+//         }
+//     }
+// }
+
+// impl<M, D> DataCollectionBase<DataRow<D>> for DataRowCollection<M, D> {
+//     fn release_items(&self, start: i64, end: i64) {
+//         // while (start < end) {
+//         //   base[start].table = null;
+//         //   start++;
+//         // }
+//         unimplemented!()
+//     }
+
+//     fn update_items(&self, start: i64) {
+//         // let len = length;
+//         // while (start < len) {
+//         //   base[start]
+//         //     ..table = table
+//         //     ..index = start++;
+//         // }
+//         unimplemented!()
+//     }
+
+//     // @override
+//     // Iterator<E> get iterator => DataCollectionIterator<E>(this);
+
+//     // @override
+//     // E get first => base.first;
+
+//     // @override
+//     // E get last => base.last;
+
+//     // @override
+//     // E get single => base.single;
+
+//     // @override
+//     // i64 get length => base.length;
+
+//     // fn set length(&self, i64 value) {
+//     //   // TODO: implement.
+//     //   throw UnimplementedError();
+//     // }
+
+//     // @override
+//     // E operator [](i64 index) => base[index];
+
+//     // @override
+//     // operator []=(i64 index, E value) {
+//     //   // TODO: implement.
+//     //   throw UnimplementedError();
+//     // }
+
+//     fn add(&self, value: DataRow<D>) {
+//         // let index = length;
+//         // base.add(value);
+//         // updateItems(index);
+//         // table.onRowsOrColumnsInserted(this, index, 1);
+//         unimplemented!()
+//     }
+
+//     // fn add_all(&self, iterable: Iterator<E>) {
+//     // //     // let index = length;
+//     // //     // base.addAll(iterable);
+//     // //     // updateItems(index);
+//     // //     // table.onRowsOrColumnsInserted(this, index, iterable.length);
+//     // }
+
+//     // @override
+//     // E elementAt(&self, i64 index) => base[index];
+
+//     fn insert(&self, index: i64, value: DataRow<D>) {
+//         // base.insert(index, value);
+//         // updateItems(index);
+//         // table.onRowsOrColumnsInserted(this, index, 1);
+//         unimplemented!()
+//     }
+
+//     // fn insert_all(&self, index: i64, iterable: Iterable<E>) {
+//     //     // base.insertAll(index, iterable);
+//     //     // updateItems(index);
+//     //     // table.onRowsOrColumnsInserted(this, index, iterable.length);
+//     // }
+
+//     fn remove(&self, element: DataRow<D>) -> bool {
+//         // let index = base.indexOf(element);
+//         // if (index == -1) return false;
+//         // removeAt(index);
+//         // return true;
+//         unimplemented!()
+//     }
+
+//     fn clear(&self) {
+//         // let len = length;
+//         // if (len == 0) return;
+//         // releaseItems(0, len);
+//         // base.clear();
+//         // table.onRowsOrColumnsRemoved(this, 0, len);
+//         unimplemented!()
+//     }
+
+//     fn remove_at(&self, index: i64) -> DataRow<D> {
+//         // let e = base.removeAt(index);
+//         // e.table = null;
+//         // updateItems(index);
+//         // table.onRowsOrColumnsRemoved(this, index, 1);
+//         // return e;
+//         unimplemented!()
+//     }
+
+//     fn remove_last(&self) -> DataRow<D> {
+//         // let e = base.removeLast();
+//         // e.table = null;
+//         // table.onRowsOrColumnsRemoved(this, length, 1);
+//         // return e;
+//         unimplemented!()
+//     }
+
+//     fn remove_range(&self, start: i64, end: i64) {
+//         // releaseItems(start, end);
+//         // base.remove_range(start, end);
+//         // updateItems(start);
+//         // table.onRowsOrColumnsRemoved(this, start, end - start);
+//         unimplemented!()
+//     }
+
+//     // FIXME: bellow implementation
+
+//     // DataRow toDataRow(value) =>
+//     //     value is DataRow ? value : DataRow.internal(table, value);
+
+//     // DataRowCollection(DataTable table) : super(table);
+
+//     // /// Adds [value] to this collection.
+//     // ///
+//     // /// [value] can be a [DataRow] or a [List].
+//     // fn add(value: E) {
+//     //     // self.base.add(toDataRow(value));
+//     // }
+
+//     // /// Adds all elements of [iterable] to this collection.
+//     // ///
+//     // /// Each element in [iterable] can be a [DataRow] or a [List].
+//     // fn addAll(iterable: Iterable) {
+//     //     // self.base.addAll(iterable.map(toDataRow));
+//     // }
+
+//     // /// Inserts [value] at position [index] in this collection.
+//     // ///
+//     // /// [value] can be a [DataRow] or a [List].
+//     // fn insert(index: i64, value: E) {
+//     //     // self.base.insert(index, toDataRow(value));
+//     // }
+
+//     // /// Inserts all elements of [iterable] at position [index] in this collection.
+//     // ///
+//     // /// Each element in [iterable] can be a [DataRow] or a [List].
+//     // fn insertAll(index: i64, iterable: Iterable) {
+//     //     // self.base.insertAll(index, iterable.map(toDataRow));
+//     // }
+// }
\ No newline at end of file

From 94a30d4e7018a24e34f1fb35914c59a4de7a2cd3 Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Mon, 8 Mar 2021 22:26:53 +0700
Subject: [PATCH 2/8] Aestetic changes for repo

---
 README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/README.md b/README.md
index 385970b..26c43c7 100644
--- a/README.md
+++ b/README.md
@@ -19,8 +19,6 @@
 
 Angular Rust is a high productivity, frontend web framework for the [Rust language](https://www.rust-lang.org/).
 
-Current Version: 0.1.0 (2021-03-01)
-
 ## Quick Start
 
 Install Angular Rust:

From 3b92bcde6a260e438c415831f8f3d9cf033b3051 Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Tue, 9 Mar 2021 21:54:53 +0700
Subject: [PATCH 3/8] A bit changes

---
 src/lib.rs | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index f469758..9ae8343 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -5,9 +5,9 @@
 use intmap::IntMap;
 use std::{collections::HashMap, fmt};
 
-pub mod row;
-pub mod collumn;
 pub mod collection;
+pub mod collumn;
+pub mod row;
 
 #[derive(Clone, Debug)]
 pub struct Channel<'a> {
@@ -32,8 +32,8 @@ pub struct DataCellChangeRecord<T>
 where
     T: fmt::Display,
 {
-    pub row_index: i64,
-    pub column_index: i64,
+    pub row_index: usize,
+    pub column_index: usize,
     pub old_value: T,
     pub new_value: T,
 }
@@ -42,7 +42,7 @@ impl<T> DataCellChangeRecord<T>
 where
     T: fmt::Display,
 {
-    fn new(row_index: i64, column_index: i64, old_value: T, new_value: T) -> Self {
+    fn new(row_index: usize, column_index: usize, old_value: T, new_value: T) -> Self {
         Self {
             row_index,
             column_index,
@@ -95,7 +95,7 @@ impl fmt::Display for DataCollectionChangeRecord {
 pub trait TableEntity {}
 
 #[derive(Clone)]
-pub struct DataStream<'a, M, D> 
+pub struct DataStream<'a, M, D>
 where
     M: fmt::Display,
     D: fmt::Display,
@@ -111,27 +111,27 @@ where
     // rowsChangeController: StreamController<DataCollectionChangeRecord>,
 }
 
-impl<'a, M, D> Default for DataStream<'a, M, D> 
+impl<'a, M, D> Default for DataStream<'a, M, D>
 where
     M: fmt::Display,
     D: fmt::Display,
 {
     fn default() -> Self {
-        Self{
+        Self {
             meta: Vec::new(),
             frames: Vec::new(),
         }
     }
 }
 
-impl<'a, M, D> DataStream<'a, M, D> 
+impl<'a, M, D> DataStream<'a, M, D>
 where
     M: fmt::Display,
     D: fmt::Display,
 {
     /// Creates a [DataTable] with optional data [data].
     ///
-    /// * 'metadata' - contains row names
+    /// * 'meta' - contains row names
     ///
     /// The first row in [data] contains the column names.
     /// The data type of each column is determined by the first non-null value
@@ -140,7 +140,7 @@ where
     /// All values in each column are expected to be of the same type,
     /// and all rows are expected to have the same length.
     // data is optional
-    pub fn new(metadata: Vec<Channel>, data: Vec<DataFrame<M, D>>) -> Self {
+    pub fn new(meta: Vec<Channel<'a>>, frames: Vec<DataFrame<M, D>>) -> Self {
         // let data_table = DataTable {
         //     // column_index_by_name: Default::default(),
         //     // columns: None,
@@ -161,7 +161,7 @@ where
         // }
 
         // rows.add_all(data);
-        unimplemented!()
+        Self { meta, frames }
     }
 
     fn on_cell_changed(row_index: i64, column_index: i64, old_value: String, new_value: String) {
@@ -270,7 +270,6 @@ where
     // }
 }
 
-
 #[cfg(test)]
 mod tests {
     #[test]

From 14568deda23a9edce840f18a35d140661ab70895 Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Sat, 13 Mar 2021 09:47:39 +0700
Subject: [PATCH 4/8] no branding

---
 Cargo.toml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Cargo.toml b/Cargo.toml
index 1838d22..e6170dc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,5 +15,8 @@ license = "MPL-2.0"
 [badges]
 maintenance = { status = "actively-developed" }
 
+[lib]
+name = "dataflow"
+
 [dependencies]
 intmap = "0.7"
\ No newline at end of file

From 9e57a49acb8f95610fa454f552537c8e1101e61c Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Sun, 14 Mar 2021 23:30:25 +0700
Subject: [PATCH 5/8] Copy

---
 src/lib.rs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index 9ae8343..2c8580a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -98,7 +98,7 @@ pub trait TableEntity {}
 pub struct DataStream<'a, M, D>
 where
     M: fmt::Display,
-    D: fmt::Display,
+    D: fmt::Display + Copy,
 {
     pub meta: Vec<Channel<'a>>,
     // data is renamed to frames
@@ -114,7 +114,7 @@ where
 impl<'a, M, D> Default for DataStream<'a, M, D>
 where
     M: fmt::Display,
-    D: fmt::Display,
+    D: fmt::Display + Copy,
 {
     fn default() -> Self {
         Self {
@@ -127,7 +127,7 @@ where
 impl<'a, M, D> DataStream<'a, M, D>
 where
     M: fmt::Display,
-    D: fmt::Display,
+    D: fmt::Display + Copy,
 {
     /// Creates a [DataTable] with optional data [data].
     ///

From 3a1426e78966eac3a706c2433c2cc824044614d5 Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Sun, 21 Mar 2021 20:05:40 +0700
Subject: [PATCH 6/8] v0.1.1

---
 CHANGELOG.md    |  24 +++++++
 CONTRIBUTING.md | 187 +++++++++++++++++++++++++++++++++++++++++++++++-
 CONTRIBUTORS.md |  10 +++
 README.md       |  86 ++++++++++++++++++----
 4 files changed, 289 insertions(+), 18 deletions(-)
 create mode 100644 CHANGELOG.md
 create mode 100644 CONTRIBUTORS.md

diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..1d6474d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Changelog
+
+## Package vX.X.X (YYYY-MM-DD) 
+
+### Improved
+
+- A here your changes
+
+### Added
+
+- A here your changes
+
+### Fixed
+
+- A here your changes
+
+### Improvement
+
+- A here your changes
+
+### Removed
+
+- A here your changes
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c2daa99..42ebc7d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,5 +1,186 @@
-# Contributing to Angular Rust
+## Contributing to Angular Rust
 
-Want to contribute to Angular Rust? There are a few things you need to know.  
+This describes how developers may contribute to Angular Rust.
 
-We wrote a **[contribution guide](https://angular-rust.github.io/contributing/)** to help you get started.
\ No newline at end of file
+## Mission
+
+Angular Rust's mission is to provide a batteries-included framework for making large scale web and desktop application development as efficient and maintainable as possible.
+
+The design should be configurable and modular so that it can grow with the developer. However, it should provide a wonderful un-boxing experience and default configuration that can woo new developers and make simple web and desktop apps straight forward. The framework should have an opinion about how to do all of the common tasks in web and desktop development to reduce unnecessary cognitive load.
+
+Perhaps most important of all, Angular Rust should be a joy to use. We want to reduce the time spent on tedious boilerplate functionality and increase the time
+available for creating polished solutions for your application's target users.
+
+## How to Contribute
+
+### Join the Community
+
+The first step to improving Angular Rust is to join the community and help grow it! You can find the community on:
+
+ [![](https://img.shields.io/badge/Facebook-1877F2?style=for-the-badge&logo=facebook&logoColor=white)](https://www.facebook.com/groups/angular.rust) 
+ [![](https://img.shields.io/badge/Stack_Overflow-FE7A16?style=for-the-badge&logo=stack-overflow&logoColor=white)](https://stackoverflow.com/questions/tagged/angular-rust) 
+ [![](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://www.youtube.com/channel/UCBJTkSl_JWShuolUy4JksTQ) 
+ [![](https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/@angular.rust) 
+ [![](https://img.shields.io/gitter/room/angular_rust/angular_rust?style=for-the-badge)](https://gitter.im/angular_rust/community)
+
+We believe the wider community can create better code. The first tool for improving the community is to tell the developers about the project by giving it a star. More stars - more members.
+
+ ![Star a repo](https://dudochkin-victor.github.io/assets/star-me-wide.svg)
+
+Once you've joined, there are many ways to contribute to Angular Rust:
+
+* Report bugs (via GitHub)
+* Answer questions of other community members (via Gitter or GitHub Discussions)
+* Give feedback on new feature discussions (via GitHub and Gitter)
+* Propose your own ideas (via Gitter or GitHub)
+
+### How Angular Rust is Developed
+
+We have begun to formalize the development process by adopting pragmatic practices such as:
+
+* Developing on the `develop` branch
+* Merging `develop` branch to `main` branch in 6 week iterations
+* Tagging releases with MAJOR.MINOR syntax (e.g. v0.8)
+** We may also tag MAJOR.MINOR.HOTFIX releases as needed (e.g. v0.8.1) to address urgent bugs. Such releases will not introduce or change functionality
+* Managing bugs, enhancements, features and release milestones via GitHub's Issue Tracker
+* Using feature branches to create pull requests
+* Discussing new features **before** hacking away at it
+
+
+## Dive into code
+
+### Fork this repository
+
+<img align="right" width="360" src="https://dudochkin-victor.github.io/assets/github/fork.png" alt="fork this repository" style="margin-left: 5px;"/>
+
+Fork this repository by clicking on the fork button on the top of this page.
+This will create a copy of this repository in your account.
+
+<br clear="both" />
+
+### Clone the repository
+
+<img align="right" width="360" src="https://dudochkin-victor.github.io/assets/github/clone.png" alt="clone this repository" style="margin-left: 5px;"/>
+
+Now clone the forked repository to your machine. Go to your GitHub account, open the forked repository, click on the code button and then click the _copy to clipboard_ icon.
+
+Open a terminal and run the following git command:
+
+```
+git clone "url you just copied"
+```
+
+where "url you just copied" (without the quotation marks) is the url to this repository (your fork of this project). See the previous steps to obtain the url.
+
+> use SSH tab to copy proper URL
+
+<img align="right" width="360" src="https://dudochkin-victor.github.io/assets/github/copy-to-clipboard.png" alt="copy URL to clipboard"  style="margin-left: 5px;"/>
+
+For example:
+
+```
+git clone git@github.com:$USER/ux-dataflow.git
+```
+
+where `$USER` is your GitHub username. Here you're copying the contents of the `ux-dataflow` repository on GitHub to your computer.
+
+
+<br clear="both" />
+
+### Create a branch
+
+Change to the repository directory on your computer (if you are not already there):
+
+```
+cd ux-dataflow
+```
+
+Now create a branch using the `git checkout` command:
+
+```
+git checkout -b <feature/useful-new-thing> origin/develop
+```
+replacing `<feature/useful-new-thing>` with the adequate name of the feature you will develop.
+
+### Make necessary changes and commit those changes
+
+Now that you've properly installed and forked Angular Rust, you are ready to start coding (assuming you have a validated your ideas with other community members)!
+
+### Format Your Code
+
+Remember to run `cargo fmt` before committing your changes.
+Many Go developers opt to have their editor run `cargo fmt` automatically when saving Go files.
+
+Additionally, follow the [core Rust style conventions](https://rustc-dev-guide.rust-lang.org/conventions.html) to have your pull requests accepted.
+
+### Write Tests (and Benchmarks for Bonus Points)
+
+Significant new features require tests. Besides unit tests, it is also possible to test a feature by exercising it in one of the sample apps and verifying its
+operation using that app's test suite. This has the added benefit of providing example code for developers to refer to.
+
+Benchmarks are helpful but not required.
+
+### Run the Tests
+
+Typically running the main set of unit tests will be sufficient:
+
+```
+$ cargo test
+```
+### Document Your Feature
+
+Due to the wide audience and shared nature of Angular Rust, documentation is an essential addition to your new code. **Pull requests risk not being accepted** until proper documentation is created to detail how to make use of new functionality.
+
+### Add yourself to the list of contributors
+
+Open `CONTRIBUTORS.md` file in a text editor, add your name to it. Don't add it at the beginning or end of the file. Put it anywhere in between. Now, save the file.
+
+<img width="635" src="https://dudochkin-victor.github.io/assets/github/git-status.png" alt="git status" />
+
+If you go to the project directory and execute the command `git status`, you'll see there are changes.
+
+Add those changes to the branch you just created using the `git add` command:
+
+```
+git add .
+```
+
+Now commit those changes using the `git commit` command:
+
+```
+git commit -m "$COMMENT"
+```
+
+replacing `$COMMENT` with appropriate description of your changes.
+
+### Push changes to GitHub
+
+Push your changes using the command `git push`:
+
+```
+git push origin <feature/useful-new-thing>
+```
+
+replacing `<feature/useful-new-thing>` with the name of the branch you created earlier.
+
+### Submit your changes for review
+
+Once you've done all of the above & pushed your changes to your fork, you can create a pull request for review and acceptance.
+
+If you go to your repository on GitHub, you'll see a `Compare & pull request` button. Click on that button.
+
+<img width="1000" src="https://dudochkin-victor.github.io/assets/github/compare-and-pull.png" alt="create a pull request" />
+
+Now submit the pull request.
+Do not forget to set develop branch for your pull request.
+
+<img width="1000" src="https://dudochkin-victor.github.io/assets/github/submit-pull-request.png" alt="submit pull request" />
+
+
+## Where to go from here?
+
+Congrats! You just completed the standard _fork -> clone -> edit -> pull request_ workflow that you'll encounter often as a contributor!
+
+You can check more details in our **[detailed contribution guide](https://angular-rust.github.io/contributing/)**.
+
+You could join our gitter team in case you need any help or have any questions. [Join gitter team](https://gitter.im/angular_rust/community).
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
new file mode 100644
index 0000000..dcb8c2b
--- /dev/null
+++ b/CONTRIBUTORS.md
@@ -0,0 +1,10 @@
+UX Dataflow contributors (sorted alphabetically)
+============================================
+
+* **[Victor Dudochkin](https://github.com/dudochkin.victor)**
+
+  * Core development
+
+
+
+**[Full contributors list](https://github.com/angular-rust/ux-dataflow/contributors).**
\ No newline at end of file
diff --git a/README.md b/README.md
index 26c43c7..9e9bf3f 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,15 @@
-# UX DataFlow
+<div align="center">
+
+![Star a repo](https://dudochkin-victor.github.io/assets/ux-dataflow/logo-wide.svg)
+# UX Dataflow
 
 [![API Docs][docrs-badge]][docrs-url]
 [![Crates.io][crates-badge]][crates-url]
 [![MPL-2.0 licensed][license-badge]][license-url]
 [![Gitter chat][gitter-badge]][gitter-url]
 [![Rustc Version 1.45+][rust-badge]][rust-url]
+[![loc][loc-badge]][loc-url]
+</div>
 
 [docrs-badge]: https://img.shields.io/docsrs/ux-dataflow?style=flat-square
 [docrs-url]: https://docs.rs/ux-dataflow/
@@ -13,35 +18,86 @@
 [license-badge]: https://img.shields.io/badge/license-MPL--2.0-blue.svg?style=flat-square
 [license-url]: https://github.com/angular-rust/ux-dataflow/blob/master/LICENSE
 [gitter-badge]: https://img.shields.io/gitter/room/angular_rust/angular_rust.svg?style=flat-square
-[gitter-url]: https://gitter.im/angular_rust/angular_rust
+[gitter-url]: https://gitter.im/angular_rust/community
 [rust-badge]: https://img.shields.io/badge/rustc-1.45-lightgrey.svg?style=flat-square
 [rust-url]: https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html
+[loc-badge]: https://tokei.rs/b1/github/angular-rust/ux-dataflow?category=code
+[loc-url]: https://github.com/angular-rust/ux-dataflow
 
-Angular Rust is a high productivity, frontend web framework for the [Rust language](https://www.rust-lang.org/).
+**UX Dataflow** is a streaming capable data multiplexer that allows you to aggregate data and then process it using a Chain of Responsibility design pattern.
 
-## Quick Start
+UX Dataflow was originally an attempt to implement a DataTable-like structure from Python's powerful data analysis library - Pandas. 
 
-Install Angular Rust:
+But during the development process, it became clear that a data processing mechanism was needed that would allow data to be extended by adding new data channels and the ability to handle asynchronous data streams.
 
-	cargo add ux-dataflow
+**UX Dataflow** is part of the Angular Rust framework.
 
-## Community
+Angular Rust is a high productivity, `platform-agnostic` frontend framework for the [Rust language](https://www.rust-lang.org/). It now supports desktop and web development. Angular Rust currently uses GTK for desktop development and WebAssembly for web development. We are planning to add support for mobile development.
+
+## Features
 
-* [Gitter](https://gitter.im/angular_rust/community)
-* [StackOverflow](https://stackoverflow.com/questions/tagged/angular-rust)
+- [x] DataFrame abstraction for extending data-feeds (channels)
+- [x] Metadata describing DataStream channels
+- [ ] Streaming capability
+- [ ] Composite data channel support.
+- [ ] Support for heterogeneous data links such as dataset of OHLCV, f64, i64 and U256 in the same DataStream.
 
+> The unimplemented features depend on `User-Experience` during the development of the [UX Indicators](https://github.com/angular-rust/ux-indicators) crate. So far, we have implemented the features required for the [UX Charts](https://github.com/angular-rust/ux-charts) crate.
+
+## Quick Start
+
+Install Angular Rust:
+
+	cargo add ux-dataflow
 
 ## Learn More
 
-* [Manual, Samples, Docs, etc](https://angular-rust.github.io/)
+* [Manual, Docs, etc](https://angular-rust.github.io/)
+* [Samples](https://github.com/angular-rust/ux-samples)
 * [Apps using Angular Rust](https://github.com/angular-rust/ux-dataflow/wiki/Apps-in-the-Wild)
 * [Articles Featuring Angular Rust](https://github.com/angular-rust/ux-dataflow/wiki/Articles)
 
-## Bugs ##
-If you find an issue, let me know [here](https://github.com/angular-rust/ux-dataflow/issues/new).
+## Community
+
+ [![](https://img.shields.io/badge/Facebook-1877F2?style=for-the-badge&logo=facebook&logoColor=white)](https://www.facebook.com/groups/angular.rust) 
+ [![](https://img.shields.io/badge/Stack_Overflow-FE7A16?style=for-the-badge&logo=stack-overflow&logoColor=white)](https://stackoverflow.com/questions/tagged/angular-rust) 
+ [![](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://www.youtube.com/channel/UCBJTkSl_JWShuolUy4JksTQ) 
+ [![](https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/@angular.rust) 
+ [![](https://img.shields.io/gitter/room/angular_rust/angular_rust?style=for-the-badge)](https://gitter.im/angular_rust/community)
+
 
 ## Contributing
-I openly welcome community contributions, including bug fixes and new features. Please feel free to [fork the project](https://github.com/angular-rust/ux-dataflow/fork) and submit a pull request.
 
-* [Contributing Code Guidelines](https://github.com/angular-rust/ux-dataflow/blob/main/CONTRIBUTING.md)
-* [Angular Rust Contributors](https://github.com/angular-rust/ux-dataflow/graphs/contributors)
+We believe the wider community can create better code. The first tool for improving the community is to tell the developers about the project by giving it a star. More stars - more members.
+
+ ![Star a repo](https://dudochkin-victor.github.io/assets/star-me-wide.svg)
+ 
+Angular Rust is a community effort and we welcome all kinds of contributions, big or small, from developers of all backgrounds. We want the Angular Rust community to be a fun and friendly place, so please review our [Code of Conduct](CODE_OF_CONDUCT.md) to learn what behavior will not be tolerated.
+
+## New to Angular Rust?
+
+Start learning about the framework by helping us improve our [documentation](https://angular-rust.github.io/). Pull requests which improve test coverage are also very welcome.
+
+### Looking for inspiration?
+
+Check out the community curated list of awesome things related to Angular Rust / WebAssembly at [awesome-angular-rust](https://github.com/angular-rust/awesome-angular-rust).
+
+### Confused about something?
+
+Feel free to drop into our [Gitter chatroom](https://gitter.im/angular_rust/community) or open a [new "Question" issue](https://github.com/angular-rust/ux-dataflow/issues/new/choose) to get help from contributors. Often questions lead to improvements to the ergonomics of the framework, better documentation, and even new features!
+
+### Ready to dive into the code?
+
+After reviewing the [Contributing Code Guidelines](CONTRIBUTING.md), check out the ["Good First Issues"](https://github.com/angular-rust/ux-dataflow/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) (they are eager for attention!). Once you find one that interests you, feel free to assign yourself to an issue and don't hesitate to reach out for guidance, the issues vary in complexity.
+
+### Let's help each other!
+
+Come help us on the [issues that matter that the most](https://github.com/angular-rust/ux-dataflow/labels/%3Adollar%3A%20Funded%20on%20Issuehunt) and receive a small cash reward for your troubles. We use [Issuehunt](https://issuehunt.io/r/angular-rust/ux-dataflow/) to fund issues from our Open Collective funds. If you really care about an issue, you can choose to add funds yourself! 
+
+### Found a bug?
+
+Please [report all bugs!](https://github.com/angular-rust/ux-dataflow/issues/new/choose) We are happy to help support developers fix the bugs they find if they are interested and have the time.
+
+## Todo
+- [ ] Documentation
+- [ ] DataStream controller infographics

From 5771f5d30b8917535242021bbb50658c3b353809 Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Sun, 21 Mar 2021 20:13:25 +0700
Subject: [PATCH 7/8] v0.1.1 release

---
 Cargo.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Cargo.toml b/Cargo.toml
index e6170dc..a51b9e6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "ux-dataflow"
-version = "0.1.0"
+version = "0.1.1"
 authors = ["Victor Dudochkin <dudochkin.victor@gmail.com>", "Maksim Makarov <pr0n1x@yandex.ru>"]
 readme = "README.md"
 homepage = "https://angular-rust.github.io/ux-dataflow"

From 6f890006b81b8510ff81fbe8af31e8c4c8cdf7cf Mon Sep 17 00:00:00 2001
From: Victor Dudochkin <dudochkin.victor@gmail.com>
Date: Sun, 18 Apr 2021 19:52:54 +0700
Subject: [PATCH 8/8] Facade (#1)

* Codecov and other changes

* Test workflow

* Facade
---
 .github/FUNDING.yml                         |  5 +++
 .github/ISSUE_TEMPLATE/bug_report.md        | 18 ++++++++
 .github/ISSUE_TEMPLATE/feature_request.md   | 17 +++++++
 .github/ISSUE_TEMPLATE/general-questions.md | 10 +++++
 .github/codecov.yml                         |  9 ++++
 .github/workflows/audit.yaml                | 17 +++++++
 .github/workflows/coverage.yaml             | 49 +++++++++++++++++++++
 .github/workflows/tests.yml                 | 27 ++++++++++++
 CONTRIBUTING.md                             |  8 ++--
 Cargo.toml                                  |  2 +-
 README.md                                   | 25 ++++++-----
 src/collumn.rs                              | 10 ++---
 src/row.rs                                  |  4 +-
 13 files changed, 179 insertions(+), 22 deletions(-)
 create mode 100644 .github/FUNDING.yml
 create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md
 create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md
 create mode 100644 .github/ISSUE_TEMPLATE/general-questions.md
 create mode 100644 .github/codecov.yml
 create mode 100644 .github/workflows/audit.yaml
 create mode 100644 .github/workflows/coverage.yaml
 create mode 100644 .github/workflows/tests.yml

diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..08cd9ac
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,5 @@
+# These are supported funding model platforms
+
+ko_fi: dudochkin
+liberapay: dudochkin
+open_collective: dudochkin
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..c8f5856
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,18 @@
+---
+name: Bug report
+about: About unexpected behaviors
+title: "[BUG] "
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+Describe what is expected, what you actually get.
+It would be nice to have screenshot or result image uploaded  
+
+**To Reproduce**
+Some minimal reproduce code is highly recommended
+
+**Version Information**
+Please give us what version you are using. If you are pulling `UX Dataflow` directly from git repo, please mention this as well
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..3cb1229
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,17 @@
+---
+name: Feature request
+about: Suggest an idea to UX Dataflow maintainers
+title: "[Feature Request]"
+labels: feature request
+assignees: ''
+
+---
+
+### What is the feature ?
+*Detailed feature descrption*
+
+### (Optional) Why this feature is useful and how people would use the feature ?
+*Explain why this feature is important*
+
+### (Optional) Additional Information
+*More details are appreciated:)*
diff --git a/.github/ISSUE_TEMPLATE/general-questions.md b/.github/ISSUE_TEMPLATE/general-questions.md
new file mode 100644
index 0000000..96d4e89
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/general-questions.md
@@ -0,0 +1,10 @@
+---
+name: General Questions
+about: Any other issues
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
diff --git a/.github/codecov.yml b/.github/codecov.yml
new file mode 100644
index 0000000..f2cf6e4
--- /dev/null
+++ b/.github/codecov.yml
@@ -0,0 +1,9 @@
+comment:
+  layout: "diff, flags, files"
+  require_changes: true
+
+coverage:
+  status:
+    project:
+      default:
+        informational: true
diff --git a/.github/workflows/audit.yaml b/.github/workflows/audit.yaml
new file mode 100644
index 0000000..e0c79d5
--- /dev/null
+++ b/.github/workflows/audit.yaml
@@ -0,0 +1,17 @@
+name: Security audit
+on:
+  pull_request:
+  push:
+    branches:
+      - master
+  schedule:
+    - cron: '0 0 * * 0'
+
+jobs:
+  security_audit:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions-rs/audit-check@v1
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml
new file mode 100644
index 0000000..b9cf34a
--- /dev/null
+++ b/.github/workflows/coverage.yaml
@@ -0,0 +1,49 @@
+name: Coverage
+
+#on:
+#  push:
+#    branches:
+#      - main
+#  pull_request:
+
+on: [push, pull_request]
+
+env:
+  CARGO_TERM_COLOR: always
+  RUST_BACKTRACE: full
+
+jobs:
+  coverage:
+    name: Coverage
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v2
+
+      - name: Install Rust
+        uses: actions-rs/toolchain@v1
+        with:
+          toolchain: nightly
+          profile: minimal
+          default: true
+
+      - name: Restore cache
+        uses: Swatinem/rust-cache@v1
+
+      - name: Run cargo-tarpaulin
+        uses: actions-rs/tarpaulin@v0.1
+        with:
+          args: '--all-features --run-types Doctests,Tests'
+          timeout: 120
+
+      - name: Upload to codecov.io
+        uses: codecov/codecov-action@239febf655bba88b16ff5dea1d3135ea8663a1f9
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+
+      - name: Archive code coverage results
+        uses: actions/upload-artifact@v2
+        with:
+          name: code-coverage-report
+          path: cobertura.xml
+          retention-days: 30
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000..6893c69
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,27 @@
+name: Tests
+
+on: [push, pull_request]
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v1
+    - name: Build
+      run: cargo build --verbose
+    - name: Run tests
+      run: cargo test --verbose
+
+  clippy_check:
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v1
+      - run: rustup component add clippy
+      - uses: actions-rs/clippy-check@v1
+        with:
+          token: ${{ secrets.GITHUB_TOKEN }}
+          args: --all-features
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 42ebc7d..1350b5a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,6 +13,10 @@ available for creating polished solutions for your application's target users.
 
 ## How to Contribute
 
+We believe the wider community can create better code. The first tool for improving the community is to tell the developers about the project by giving it a star. More stars - more members.
+
+[![](https://dudochkin-victor.github.io/assets/star-me-wide.svg)](https://github.com/angular-rust/ux-dataflow)
+
 ### Join the Community
 
 The first step to improving Angular Rust is to join the community and help grow it! You can find the community on:
@@ -23,10 +27,6 @@ The first step to improving Angular Rust is to join the community and help grow
  [![](https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/@angular.rust) 
  [![](https://img.shields.io/gitter/room/angular_rust/angular_rust?style=for-the-badge)](https://gitter.im/angular_rust/community)
 
-We believe the wider community can create better code. The first tool for improving the community is to tell the developers about the project by giving it a star. More stars - more members.
-
- ![Star a repo](https://dudochkin-victor.github.io/assets/star-me-wide.svg)
-
 Once you've joined, there are many ways to contribute to Angular Rust:
 
 * Report bugs (via GitHub)
diff --git a/Cargo.toml b/Cargo.toml
index a51b9e6..7cf9b4c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "ux-dataflow"
 version = "0.1.1"
-authors = ["Victor Dudochkin <dudochkin.victor@gmail.com>", "Maksim Makarov <pr0n1x@yandex.ru>"]
+authors = ["Victor Dudochkin <dudochkin.victor@gmail.com>"]
 readme = "README.md"
 homepage = "https://angular-rust.github.io/ux-dataflow"
 repository = "https://github.com/angular-rust/ux-dataflow"
diff --git a/README.md b/README.md
index 9e9bf3f..741a5bc 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,14 @@
 <div align="center">
 
-![Star a repo](https://dudochkin-victor.github.io/assets/ux-dataflow/logo-wide.svg)
+[![](https://dudochkin-victor.github.io/assets/ux-dataflow/logo-wide.svg)](#top)
 # UX Dataflow
 
 [![API Docs][docrs-badge]][docrs-url]
 [![Crates.io][crates-badge]][crates-url]
+[![Code coverage][codecov-badge]][codecov-url]
+[![Tests][tests-badge]][tests-url]
 [![MPL-2.0 licensed][license-badge]][license-url]
 [![Gitter chat][gitter-badge]][gitter-url]
-[![Rustc Version 1.45+][rust-badge]][rust-url]
 [![loc][loc-badge]][loc-url]
 </div>
 
@@ -17,11 +18,13 @@
 [crates-url]: https://crates.io/crates/ux-dataflow
 [license-badge]: https://img.shields.io/badge/license-MPL--2.0-blue.svg?style=flat-square
 [license-url]: https://github.com/angular-rust/ux-dataflow/blob/master/LICENSE
-[gitter-badge]: https://img.shields.io/gitter/room/angular_rust/angular_rust.svg?style=flat-square
+[gitter-badge]: https://img.shields.io/gitter/room/angular_rust/community.svg?style=flat-square
 [gitter-url]: https://gitter.im/angular_rust/community
-[rust-badge]: https://img.shields.io/badge/rustc-1.45-lightgrey.svg?style=flat-square
-[rust-url]: https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html
-[loc-badge]: https://tokei.rs/b1/github/angular-rust/ux-dataflow?category=code
+[tests-badge]: https://img.shields.io/github/workflow/status/angular-rust/ux-dataflow/Tests?label=tests&logo=github&style=flat-square
+[tests-url]: https://github.com/angular-rust/ux-dataflow/actions/workflows/tests.yml
+[codecov-badge]: https://img.shields.io/codecov/c/github/angular-rust/ux-dataflow?logo=codecov&style=flat-square&token=M7BW7mahNb
+[codecov-url]: https://codecov.io/gh/angular-rust/ux-dataflow
+[loc-badge]: https://img.shields.io/tokei/lines/github/angular-rust/ux-dataflow?style=flat-square
 [loc-url]: https://github.com/angular-rust/ux-dataflow
 
 **UX Dataflow** is a streaming capable data multiplexer that allows you to aggregate data and then process it using a Chain of Responsibility design pattern.
@@ -32,7 +35,9 @@ But during the development process, it became clear that a data processing mecha
 
 **UX Dataflow** is part of the Angular Rust framework.
 
-Angular Rust is a high productivity, `platform-agnostic` frontend framework for the [Rust language](https://www.rust-lang.org/). It now supports desktop and web development. Angular Rust currently uses GTK for desktop development and WebAssembly for web development. We are planning to add support for mobile development.
+**Angular Rust** is a high productivity, `platform-agnostic` frontend framework for the [Rust language](https://www.rust-lang.org/). It now supports desktop and web development. Angular Rust currently uses Clutter for desktop development and WebAssembly for web development. We are planning to add support for mobile development.
+
+![Angular Rust structure](https://dudochkin-victor.github.io/assets/angular-rust/structure.svg)
 
 ## Features
 
@@ -46,7 +51,7 @@ Angular Rust is a high productivity, `platform-agnostic` frontend framework for
 
 ## Quick Start
 
-Install Angular Rust:
+Install UX Dataflow:
 
 	cargo add ux-dataflow
 
@@ -70,11 +75,11 @@ Install Angular Rust:
 
 We believe the wider community can create better code. The first tool for improving the community is to tell the developers about the project by giving it a star. More stars - more members.
 
- ![Star a repo](https://dudochkin-victor.github.io/assets/star-me-wide.svg)
+  [![](https://dudochkin-victor.github.io/assets/star-me-wide.svg)](https://github.com/angular-rust/ux-dataflow#top)
  
 Angular Rust is a community effort and we welcome all kinds of contributions, big or small, from developers of all backgrounds. We want the Angular Rust community to be a fun and friendly place, so please review our [Code of Conduct](CODE_OF_CONDUCT.md) to learn what behavior will not be tolerated.
 
-## New to Angular Rust?
+### New to Angular Rust?
 
 Start learning about the framework by helping us improve our [documentation](https://angular-rust.github.io/). Pull requests which improve test coverage are also very welcome.
 
diff --git a/src/collumn.rs b/src/collumn.rs
index 2d71aae..e18e8f3 100644
--- a/src/collumn.rs
+++ b/src/collumn.rs
@@ -15,7 +15,7 @@ impl<'a> DataColumn<'a> {
     }
 }
 
-// pub struct DataColumnCollection<M, D> 
+// pub struct DataColumnCollection<M, D>
 // where
 //     M: fmt::Display,
 // {
@@ -23,12 +23,12 @@ impl<'a> DataColumn<'a> {
 //     // table: DataTable<'a, M, D>,
 // }
 
-// impl<M, D> DataColumnCollection<M, D> 
+// impl<M, D> DataColumnCollection<M, D>
 // where
 //     M: fmt::Display,
 // {
 //     pub fn new(table: &DataTable<M, D>) -> Self {
-      
+
 //         Self {
 //             // base: Default::default(),
 //             // table
@@ -36,7 +36,7 @@ impl<'a> DataColumn<'a> {
 //     }
 // }
 
-// impl<'a, M, D> DataCollectionBase<DataColumn<'a>> for DataColumnCollection<M, D> 
+// impl<'a, M, D> DataCollectionBase<DataColumn<'a>> for DataColumnCollection<M, D>
 // where
 //     M: fmt::Display,
 // {
@@ -166,4 +166,4 @@ impl<'a> DataColumn<'a> {
 //     // fn add2(&self, name: String, dtype: Type) {
 //     //     // add(DataColumn(name, dtype));
 //     // }
-// }
\ No newline at end of file
+// }
diff --git a/src/row.rs b/src/row.rs
index a4611be..934dd45 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -11,7 +11,7 @@ impl<T> TableEntity for DataRow<T> {}
 
 impl<T> DataRow<T> {
     /// Converts a column index or name to an index.
-    fn to_index(column_index_or_name: i64) -> i64 {
+    fn to_index(&self, column_index_or_name: i64) -> i64 {
         // if (columnIndexOrName is int) return columnIndexOrName;
         // return table.columnIndexByName[columnIndexOrName];
         unimplemented!()
@@ -217,4 +217,4 @@ impl<T> DataRow<T> {
 //     // fn insertAll(index: i64, iterable: Iterable) {
 //     //     // self.base.insertAll(index, iterable.map(toDataRow));
 //     // }
-// }
\ No newline at end of file
+// }
