1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
//! Types used for indexing into HLists and coproducts. //! //! frunk frequently uses phantom index types as a technique to avoid //! overlapping impls for some traits. //! //! Currently, `Index` type parameters in traits are not ever really intended //! to be selected by the user, and are instead simply solved for by type //! inference wherever the compiler can see that there is a unique solution. //! Therefore, you don't really have much of a reason to use the things in this //! module. //! //! **...yet.** `;)` use std::marker::PhantomData; // Largely lifted from https://github.com/Sgeo/hlist/blob/master/src/lib.rs#L30 /// Used as an index into an `HList`. /// /// `Here` is 0, pointing to the head of the HList. /// /// Users should normally allow type inference to create this type. pub struct Here { _priv: (), } /// Used as an index into an `HList`. /// /// `There<T>` is 1 + `T`. /// /// Users should normally allow type inference to create this type. pub struct There<T> { _marker: PhantomData<T>, } /// An index denoting that `Suffix` is just that. pub struct Suffixed<Suffix> { _marker: PhantomData<Suffix>, } /// Index for the case where we don't need to do any transmogrifying at all because the source /// type is the same as the target type. pub enum IdentityTransMog {} /// Index for the case where we need to do work in order to transmogrify one type into another. pub struct DoTransmog<PluckByKeyIndex, TransMogIndex> { _marker1: PhantomData<PluckByKeyIndex>, _marker2: PhantomData<TransMogIndex>, } /// Index type wrapper for transmogrifying a generic Source to a generic Target pub struct LabelledGenericTransmogIndicesWrapper<T>(PhantomData<T>); /// Index type wrapper for transmogrifying a generic plucked Source to a generic Target pub struct PluckedLabelledGenericIndicesWrapper<T>(T); /// Index type wrapper for transmogrifying through a (known) container (e.g. `Vec`). pub struct MappingIndicesWrapper<T>(PhantomData<(T)>);