rust2fun/
applicative.rs

1//! Applicative functor.
2//! Allows application of a function in an Applicative context to a value in an Applicative context.
3//!
4//! # Examples
5//!
6//! ```
7//! use rust2fun::prelude::*;
8//!
9//! # type CreditCardNumber = String;
10//! # type Date = String;
11//! # type Code = u16;
12//! # type Error = u8;
13//! #
14//! # struct CreditCard {
15//! #     number: CreditCardNumber,
16//! #     expiration: Date,
17//! #     cvv: Code,
18//! # }
19//! #
20//! # impl CreditCard {
21//! #     fn new(number: CreditCardNumber, expiration: Date, cvv: Code) -> Self {
22//! #         CreditCard {
23//! #             number,
24//! #             expiration,
25//! #             cvv,
26//! #         }
27//! #     }
28//! # }
29//! #
30//! fn validate_number(number: CreditCardNumber) -> Result<CreditCardNumber, Error> {
31//!     unimplemented!("Validate credit card number")
32//! }
33//!
34//! fn validate_expiration(date: Date) -> Result<Date, Error> {
35//!     unimplemented!("Validate credit card expiration date")
36//! }
37//!
38//! fn validate_cvv(cvv: Code) -> Result<Code, Error> {
39//!     unimplemented!("Validate credit card cvv")
40//! }
41//!
42//! fn validate_credit_card(
43//!     number: CreditCardNumber,
44//!     expiration: Date,
45//!     cvv: Code,
46//! ) -> Result<CreditCard, Error> {
47//!     Result::pure(CreditCard::new)
48//!         .ap3(validate_number(number),
49//!              validate_expiration(expiration),
50//!              validate_cvv(cvv))
51//! }
52//! ```
53
54use crate::apply::Apply;
55use crate::pure::Pure;
56
57/// Applicative functor. This is a stronger version of Apply that has pure.
58/// See [the module level documentation](self) for more.
59pub trait Applicative<A, B>: Apply<A, B> + Pure {}
60
61impl<A, B, T> Applicative<A, B> for T where T: Apply<A, B> + Pure {}