xylo-lang 0.1.0

A functional programming language for generative art.
Documentation
use crate::builtin_function;
use crate::interpreter::Value;

use crate::error::{Error, Result};
use noise::Perlin;
use rand_chacha::ChaCha8Rng;

builtin_function!(hsl => {
    [h, s, l, Value::Shape(shape)] => {
         let h = match h {
             Value::Integer(h) => *h as f32,
             Value::Float(h)   => *h,
             _ => return Err(Error::InvalidArgument("hsl".into())),
         };
         let s = match s {
             Value::Integer(s) => *s as f32,
             Value::Float(s)   => *s,
             _ => return Err(Error::InvalidArgument("hsl".into())),
         };
         let l = match l {
             Value::Integer(l) => *l as f32,
             Value::Float(l)   => *l,
             _ => return Err(Error::InvalidArgument("hsl".into())),
         };
         shape.borrow_mut().set_hsl(h, s, l);
         Value::Shape(shape.clone())
    }
});

builtin_function!(hsla => {
    [h, s, l, a, Value::Shape(shape)] => {
         let h = match h {
             Value::Integer(h) => *h as f32,
             Value::Float(h)   => *h,
             _ => return Err(Error::InvalidArgument("hsla".into())),
         };
         let s = match s {
             Value::Integer(s) => *s as f32,
             Value::Float(s)   => *s,
             _ => return Err(Error::InvalidArgument("hsla".into())),
         };
         let l = match l {
             Value::Integer(l) => *l as f32,
             Value::Float(l)   => *l,
             _ => return Err(Error::InvalidArgument("hsla".into())),
         };
         let a = match a {
             Value::Integer(a) => *a as f32,
             Value::Float(a)   => *a,
             _ => return Err(Error::InvalidArgument("hsla".into())),
         };
         shape.borrow_mut().set_hsla(h, s, l, a);
         Value::Shape(shape.clone())
    }
});

builtin_function!(hue => {
    [Value::Integer(h), Value::Shape(shape)] => {
         shape.borrow_mut().set_hue(*h as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(h), Value::Shape(shape)] => {
         shape.borrow_mut().set_hue(*h);
         Value::Shape(shape.clone())
    }
});

builtin_function!(saturation => {
    [Value::Integer(s), Value::Shape(shape)] => {
         shape.borrow_mut().set_saturation(*s as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(s), Value::Shape(shape)] => {
         shape.borrow_mut().set_saturation(*s);
         Value::Shape(shape.clone())
    }
});

builtin_function!(lightness => {
    [Value::Integer(l), Value::Shape(shape)] => {
         shape.borrow_mut().set_lightness(*l as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(l), Value::Shape(shape)] => {
         shape.borrow_mut().set_lightness(*l);
         Value::Shape(shape.clone())
    }
});

builtin_function!(alpha => {
    [Value::Integer(a), Value::Shape(shape)] => {
         shape.borrow_mut().set_alpha(*a as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(a), Value::Shape(shape)] => {
         shape.borrow_mut().set_alpha(*a);
         Value::Shape(shape.clone())
    }
});

builtin_function!(hshift => {
    [Value::Integer(h), Value::Shape(shape)] => {
         shape.borrow_mut().shift_hue(*h as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(h), Value::Shape(shape)] => {
         shape.borrow_mut().shift_hue(*h);
         Value::Shape(shape.clone())
    }
});

builtin_function!(satshift => {
    [Value::Integer(s), Value::Shape(shape)] => {
         shape.borrow_mut().shift_saturation(*s as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(s), Value::Shape(shape)] => {
         shape.borrow_mut().shift_saturation(*s);
         Value::Shape(shape.clone())
    }
});

builtin_function!(lshift => {
    [Value::Integer(l), Value::Shape(shape)] => {
         shape.borrow_mut().shift_lightness(*l as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(l), Value::Shape(shape)] => {
         shape.borrow_mut().shift_lightness(*l);
         Value::Shape(shape.clone())
    }
});

builtin_function!(ashift => {
    [Value::Integer(a), Value::Shape(shape)] => {
         shape.borrow_mut().shift_alpha(*a as f32);
         Value::Shape(shape.clone())
    },
    [Value::Float(a), Value::Shape(shape)] => {
         shape.borrow_mut().shift_alpha(*a);
         Value::Shape(shape.clone())
    }
});

builtin_function!(hex => {
    [Value::Hex(hex), Value::Shape(shape)] => {
         shape.borrow_mut().set_hex(*hex);
         Value::Shape(shape.clone())
    }
});

builtin_function!(blend => {
    [Value::BlendMode(blend_mode), Value::Shape(shape)] => {
         shape.borrow_mut().set_blend_mode(*blend_mode);
         Value::Shape(shape.clone())
    }
});

builtin_function!(anti_alias => {
    [Value::Boolean(anti_alias), Value::Shape(shape)] => {
         shape.borrow_mut().set_anti_alias(*anti_alias);
         Value::Shape(shape.clone())
    }
});