#![ cfg_attr( not( feature = "use_std" ), no_std ) ] // zzz
#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ]
#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico")]
#![ doc( html_root_url = "https://docs.rs/wtools/latest/wtools/")]
#![ warn( rust_2018_idioms ) ]
#![ warn( missing_debug_implementations ) ]
#![ warn( missing_docs ) ]

// #![ feature( type_name_of_val ) ]
// #![ feature( trace_macros ) ]

//!
//! wTools - Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind.
//!

#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/Readme.md" ) ) ]

/* zzz : use skeptic? */

/// Dependencies.
pub mod dependencies
{
  #[ cfg( any( feature = "former", feature = "meta_former" ) ) ]
  pub use ::meta_tools::former;
  #[ cfg( any( feature = "options", feature = "meta_options" ) ) ]
  pub use ::meta_tools::options;
  #[ cfg( feature = "meta" ) ]
  pub use ::meta_tools;
  #[ cfg( feature = "mem" ) ]
  pub use ::mem_tools;
  // zzz
  // #[ cfg( feature = "impls_index" ) ]
  // pub use ::impls_index;
  // #[ cfg( feature = "mod_interface" ) ]
  // pub use ::mod_interface;
  #[ cfg( feature = "typing" ) ]
  pub use ::typing_tools;
  #[ cfg( feature = "time" ) ]
  pub use ::time_tools;
  #[ cfg( feature = "string" ) ]
  pub use ::strs_tools;
  #[ cfg( feature = "error" ) ]
  pub use ::error_tools;
  // #[ cfg( feature = "winterval" ) ]
  // pub use ::winterval;
  #[ cfg( feature = "derive" ) ]
  pub use ::derive_tools;
  #[ cfg( feature = "diagnostics" ) ]
  pub use ::diagnostics_tools;

}

/// Protected namespace of the module.
pub mod protected
{
  pub use super::orphan::*;

  #[ cfg( feature = "iter" ) ]
  pub use ::iter_tools as iter;
  #[ cfg( feature = "meta" ) ]
  pub use ::meta_tools as meta;
  #[ cfg( feature = "mem" ) ]
  pub use ::mem_tools as mem;
  #[ cfg( feature = "typing" ) ]
  pub use ::typing_tools as typing;
  #[ cfg( feature = "diagnostics" ) ]
  pub use ::diagnostics_tools as diagnostics;
  #[ cfg( any( feature = "dt", feature = "data_type" ) ) ]
  pub use ::data_type as dt;
  #[ cfg( feature = "time" ) ]
  pub use ::time_tools as time;
  #[ cfg( feature = "error" ) ]
  pub use ::error_tools as error;
  #[ cfg( feature = "string" ) ]
  pub use ::strs_tools as string;
  #[ cfg( feature = "derive" ) ]
  pub use ::derive_tools as derive;

  #[ cfg( any( feature = "former", feature = "meta_former" ) ) ]
  pub use ::meta_tools::former as former;
  #[ cfg( any( feature = "options", feature = "meta_options" ) ) ]
  pub use ::meta_tools::options as options;

}

pub use protected::*;

/// Orphan namespace of the module.
pub mod orphan
{
  pub use super::exposed::*;
}

/// Exposed namespace of the module.
pub mod exposed
{
  pub use super::prelude::*;
  #[ cfg( feature = "iter" ) ]
  pub use super::iter::exposed::*;
  #[ cfg( feature = "meta" ) ]
  pub use super::meta::exposed::*;
  #[ cfg( feature = "mem" ) ]
  pub use super::mem::exposed::*;
  #[ cfg( feature = "typing" ) ]
  pub use super::typing::exposed::*;
  #[ cfg( feature = "diagnostics" ) ]
  pub use super::diagnostics::exposed::*;
  #[ cfg( any( feature = "dt", feature = "data_type" ) ) ]
  pub use super::dt::exposed::*;
  #[ cfg( feature = "time" ) ]
  pub use super::time::exposed::*;
  #[ cfg( feature = "error" ) ]
  pub use super::error::exposed::*;
  #[ cfg( feature = "string" ) ]
  pub use super::string::exposed::*;
  #[ cfg( feature = "derive" ) ]
  pub use super::derive::exposed::*;

  #[ cfg( any( feature = "former", feature = "meta_former" ) ) ]
  pub use super::former::exposed::*;
  #[ cfg( any( feature = "options", feature = "meta_options" ) ) ]
  pub use super::options::exposed::*;

}

/// Prelude to use essentials: `use my_module::prelude::*`.
pub mod prelude
{
  #[ cfg( feature = "iter" ) ]
  pub use super::iter::prelude::*;
  #[ cfg( feature = "meta" ) ]
  pub use super::meta::prelude::*;
  #[ cfg( feature = "mem" ) ]
  pub use super::mem::prelude::*;
  #[ cfg( feature = "typing" ) ]
  pub use super::typing::prelude::*;
  #[ cfg( feature = "diagnostics" ) ]
  pub use super::diagnostics::prelude::*;
  #[ cfg( any( feature = "dt", feature = "data_type" ) ) ]
  pub use super::dt::prelude::*;
  #[ cfg( feature = "time" ) ]
  pub use super::time::prelude::*;
  #[ cfg( feature = "error" ) ]
  pub use super::error::prelude::*;
  #[ cfg( feature = "string" ) ]
  pub use super::string::prelude::*;

  #[ cfg( feature = "derive" ) ]
  pub use super::derive::prelude::*;
  // xxx
  #[ cfg( feature = "derive_clone_dyn" ) ]
  pub use super::derive::prelude::clone_dyn;

  #[ cfg( any( feature = "former", feature = "meta_former" ) ) ]
  pub use super::former::prelude::*;
  #[ cfg( any( feature = "options", feature = "meta_options" ) ) ]
  pub use super::options::prelude::*;

}
