use crate::parsers::{parens, ParseResult, Span};
use crate::parsers::{parse_assign_op, parse_f_exp_da, parse_f_head};
use crate::types::DurativeActionFunctionAssignment;
use nom::character::complete::multispace1;
use nom::combinator::map;
use nom::sequence::preceded;
use nom::Parser;
pub fn parse_f_assign_da<'a, T: Into<Span<'a>>>(
input: T,
) -> ParseResult<'a, DurativeActionFunctionAssignment> {
map(
parens((
parse_assign_op,
preceded(multispace1, parse_f_head),
preceded(multispace1, parse_f_exp_da),
)),
DurativeActionFunctionAssignment::from,
)
.parse(input.into())
}
impl crate::parsers::Parser for DurativeActionFunctionAssignment {
type Item = DurativeActionFunctionAssignment;
fn parse<'a, S: Into<Span<'a>>>(input: S) -> ParseResult<'a, Self::Item> {
parse_f_assign_da(input)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Parser;
#[test]
fn it_works() {
let input = "(increase (distance-travelled) 5)";
let (_, _effect) = DurativeActionFunctionAssignment::parse(Span::new(input)).unwrap();
}
}