ankha 0.2.3

Ankha scripting toolset
Documentation
use crate::library::{array::Array, closure::Closure, option::AnkhaOption};
use intuicio_core::{
    context::Context,
    registry::Registry,
    transformer::{DynamicManagedValueTransformer, ValueTransformer},
    types::struct_type::NativeStructBuilder,
};
use intuicio_derive::{intuicio_method, intuicio_methods};
use std::thread::{JoinHandle, spawn as std_spawn};

pub fn install(registry: &mut Registry) {
    registry.add_type(
        NativeStructBuilder::new_named_uninitialized::<Thread>("Thread")
            .module_name("thread")
            .build(),
    );
    registry.add_function(Thread::new__define_function(registry));
    registry.add_function(Thread::is_finished__define_function(registry));
    registry.add_function(Thread::join__define_function(registry));
}

pub struct Thread {
    handle: JoinHandle<AnkhaOption>,
}

#[intuicio_methods(module_name = "thread")]
impl Thread {
    #[intuicio_method(
        use_context,
        use_registry,
        transformer = "DynamicManagedValueTransformer"
    )]
    pub fn new(
        context: &mut Context,
        registry: &Registry,
        mut closure: Closure,
        arguments: Array,
    ) -> Self {
        let mut context = context.fork();
        let registry = registry.clone();
        let handle = std_spawn(move || {
            closure.call(&mut context, &registry, arguments);
            AnkhaOption::None
        });
        Self { handle }
    }

    #[intuicio_method(transformer = "DynamicManagedValueTransformer")]
    pub fn is_finished(&self) -> bool {
        self.handle.is_finished()
    }

    #[intuicio_method(transformer = "DynamicManagedValueTransformer")]
    pub fn join(self) -> AnkhaOption {
        self.handle.join().ok().unwrap_or_default()
    }
}