// Copyright 2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // Because this module is temporary... #![allow(missing_docs)] #![unstable(feature = "std_misc")] use alloc::boxed::Box; use core::marker::Send; use core::ops::FnOnce; pub struct Thunk<'a, A=(),R=()> { invoke: Box+Send + 'a>, } impl<'a, R> Thunk<'a,(),R> { pub fn new(func: F) -> Thunk<'a,(),R> where F : FnOnce() -> R, F : Send + 'a { Thunk::with_arg(move|()| func()) } } impl<'a,A,R> Thunk<'a,A,R> { pub fn with_arg(func: F) -> Thunk<'a,A,R> where F : FnOnce(A) -> R, F : Send + 'a { Thunk { invoke: Box::::new(func) } } pub fn invoke(self, arg: A) -> R { self.invoke.invoke(arg) } } pub trait Invoke { fn invoke(self: Box, arg: A) -> R; } impl Invoke for F where F : FnOnce(A) -> R { fn invoke(self: Box, arg: A) -> R { let f = *self; f(arg) } }