2 个版本
0.1.2 | 2023年10月21日 |
---|---|
0.1.1 | 2023年10月12日 |
0.1.0 |
|
#515 in 数据结构
505KB
4.5K SLoC
Dayendar = Days + Calendar
描述
Rust库,用于高级且高效的日历操作。
为什么选择Dayendar
有三个原因
- 目前还没有使用DaysCalendar结构进行日历操作的开源、完整库。这使得它成为一个独特且宝贵的解决方案。
- 它提供了标准库中不可用的高级日历操作算子和实用工具。
- 它的DaysCalendar表示和数据结构针对常见的日历任务(如合并、过滤、查找日期等)进行了优化。
功能
- DaysCalendar的灵活日历表示允许以不同形式(BiDay、Day等)建模日期。
- 强大的算子,可以有效地合并和转换日历。允许从简单的日历创建复杂的日历。
- 高级按ISO周、星期几等过滤。适用于日程安排、可用性等应用程序。
- 包含用于规范化、反转、查找前后日期的实用工具,便于进行常见的日历操作。
- 使用Rust设计,注重性能和安全。使用Vec、HashSet、BTreeMap等数据结构提供效率。
- 良好的文档,带有文档注释。易于理解和扩展。
- 开源,可以检查和贡献实现。
安装
使用Rust Cargo
cargo add dayendar
或将以下行添加到您的Cargo.toml
文件中
[dependencies]
dayendar = "0.1.2"
用法
use dayendar::types::{Month, BiDay};
use dayendar::calendar::{DaysCalendar, replicate};
fn main() {
let pattern: [BiDay; 2] = [BiDay::One, BiDay::Zero]; // pattern: One day on, the next day off.
let my_calendar = replicate::<BiDay>(&pattern, DaysCalendar::singleton
( 2024, Month::January
).unwrap()
);
println!("\n {:?}\n", my_calendar);
}
示例
案例:确定John在2023年1月应该上班的日期。John通常在星期一和星期四上班。他应该避免老板有董事会会议的日期。还要考虑2023年1月30日和31日的黑客马拉松日。
使用Struct DaysCalendar的Rust解决方案:
use dayendar::types::{Month, Weekday};
use dayendar::calendar::{
DaysCalendar,
from_day,
biday_to_vec_day
};
use std::collections::HashSet;
fn main() {
// Days of the week John usually comes to the office.
let mut john_work_days = HashSet::new();
john_work_days.insert(Weekday::Monday);
john_work_days.insert(Weekday::Thursday);
// Days when John's boss has board meetings.
let boss_meeting_days = vec![(2023, Month::January, vec![9, 11, 13, 16, 23, 24, 28])];
let boss_meetings_calendar = from_day(
DaysCalendar {
days_calendar: boss_meeting_days
}
);
// Hackathon days in January 2023.
let hackathon_days = from_day(
DaysCalendar {
days_calendar: vec![(2023, Month::January, vec![30, 31])]
}
);
// Determine John's office days considering his workdays, boss's meeting days, and hackathon days.
let john_office_days = DaysCalendar::singleton(2023, Month::January).unwrap()
.and_weekdays(john_work_days)
.minus(&boss_meetings_calendar)
.minus(&hackathon_days);
// Convert the final calendar to a vector of days.
let office_days_list = biday_to_vec_day(john_office_days.clone());
println!("\nJohn's Office Days in January 2023:\n {:?}\n", office_days_list);
}
要查看更多示例,请探索项目的"examples"文件夹,或简单地运行
cargo run --example <example_name>
文档
完整文档可在https://docs.rs/dayendar找到
贡献
与我们合作,欢迎您
欢迎提交PR!请在提交任何重大更改之前先打开一个问题来讨论。
如果您想为"Dayendar"的开发做出贡献,我们鼓励您这样做!
请在提交更改之前阅读在CONTRIBUTING中定义的贡献指南,阅读我们的治理指南GOBERNANCE和我们的行为准则CODE_OF_CONDUCT。
请注意,贡献必须签名。在执行commit
时通过添加-S
选项来签名提交
git commit -S -m "Your comment"
重要:为了签署您的贡献,您需要设置一个GPG密钥,并按照《生成GPG密钥》文档中的说明配置Git。
我们正在寻找新的维护者
如果您想成为Dayendar维护团队的一员,请在《OWNERS.md》文档中提交一个PR,并留下您的详细信息。我们会尽快与您联系。
许可协议
本项目遵循Apache 2.0 许可协议。这是一个广泛用于开源软件项目的许可协议。它允许用户以任何方式使用、修改和分发软件,只要他们遵守许可协议设定的条件。有关更多信息,请参阅Apache 2.0 许可协议的官方页面。
依赖项
~1MB
~22K SLoC