Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. use std::collections::BTreeMap;
  2. use std::collections::HashMap;
  3. use std::borrow::Cow;
  4.  
  5. pub type Timestamp = u64;
  6. pub type Data = Vec<f64>;
  7. pub type DataCow<'set> = Cow<'set, [f64]>;
  8.  
  9. #[derive(Debug)]
  10. pub struct DatapointView<'set> {
  11. pub timestamp: u64,
  12. pub data: DataCow<'set>,
  13. }
  14.  
  15. impl<'set> DatapointView<'set> {
  16. pub fn new(timestamp: Timestamp, data: DataCow<'set>) -> Self {
  17. DatapointView { timestamp, data }
  18. }
  19. }
  20.  
  21. #[derive(Debug)]
  22. pub struct DatasetView<'set> {
  23. pub name: &'set str,
  24. pub description: &'set str,
  25. pub data: &'set BTreeMap<Timestamp, Data>,
  26. }
  27.  
  28. impl<'set> DatasetView<'set> {
  29. pub fn earliest_datapoint(&self) -> Option<DatapointView> {
  30. let (time, data) = self.data.iter().next()?;
  31. let datapoint = DatapointView::new(*time, Cow::from(data));
  32.  
  33. Some(datapoint)
  34. }
  35. }
  36.  
  37. #[derive(Debug, Default)]
  38. struct DatasetManagerItem<'set> {
  39. description: String,
  40. data: BTreeMap<Timestamp, DataCow<'set>>,
  41. }
  42.  
  43. impl<'set> DatasetManagerItem<'set> {
  44. fn insert_new_point(&mut self, time: Timestamp, data: Data) -> DatapointView {
  45. let cow = Cow::from(data);
  46. self.data.insert(time, cow.clone());
  47. DatapointView::new(time, cow)
  48. }
  49. }
  50.  
  51. #[derive(Debug)]
  52. pub struct DatasetWriter<'set, 'keys> {
  53. pub todo: HashMap<&'keys str, Vec<DatapointView<'set>>>,
  54. base_path: String,
  55. }
  56.  
  57. impl<'set, 'keys> DatasetWriter<'set, 'keys> {
  58. pub fn new(path: &str) -> DatasetWriter {
  59. DatasetWriter {
  60. todo: HashMap::new(),
  61. base_path: path.to_string(),
  62. }
  63. }
  64.  
  65. pub fn enqueue_work(&mut self, dataset: &'keys str, data: DatapointView<'set>) {
  66. match self.todo.get_mut(dataset) {
  67. Some(data_vec) => {
  68. data_vec.push(data);
  69. }
  70. _ => {
  71. self.todo.insert(dataset, vec![data]);
  72. }
  73. }
  74. }
  75. }
  76.  
  77. #[derive(Debug)]
  78. pub struct DatasetManager<'mgr> {
  79. writer: DatasetWriter<'mgr, 'mgr>,
  80. datasets: HashMap<&'mgr str, DatasetManagerItem<'mgr>>,
  81. }
  82.  
  83. impl<'mgr> DatasetManager<'mgr> {
  84. pub fn new(writer: DatasetWriter<'mgr, 'mgr>) -> DatasetManager<'mgr> {
  85. DatasetManager {
  86. writer: writer,
  87. datasets: HashMap::new(),
  88. }
  89. }
  90.  
  91. pub fn insert_datapoint(&'mgr mut self, time: Timestamp, data: Data, dataset_name: &'mgr str) {
  92. let item = self.datasets.entry(dataset_name)
  93. .or_insert_with(|| DatasetManagerItem::default());
  94.  
  95. let datapoint_view = item.insert_new_point(time, data);
  96. self.writer.enqueue_work(dataset_name, datapoint_view);
  97. }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement