1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use std::time::{SystemTime, UNIX_EPOCH};
use nanoid::nanoid;
use crate::types::*;

pub fn timestamp_ms() -> f64 {
    SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as f64
}

pub fn timestamp_ns() -> u128 {
    SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u128
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Value {
    pub id:     String,
    pub stamp:  f64,
    pub dt:     u16,
    pub q:      f64,
    pub data:   Val,
    pub attr:   Vec::<Value>,
    pub curr:   i32,
    pub tags:   HashMap<String, String>,
}

#[derive(Clone, Debug)]
pub struct Applicative {
    pub f:      AppFn,
}

impl Value {
    pub fn new() -> Self {
        Self {
            id:     nanoid!(),
            stamp:  timestamp_ms(),
            dt:     NONE,
            q:      0.0,
            data:   Val::Null,
            attr:   Vec::new(),
            curr:   -1,
            tags:   HashMap::new(),
        }
    }
}

impl Applicative {
    pub fn new(f: AppFn) -> Self {
        Self {
            f:     f,
        }
    }
}