{-# Language ExplicitNamespaces #-}

-- | How the sausage is made.
--
-- These definitions are typically not revealed to the user, unless
-- you're doing something cheeky. So they are hidden behind this extra
-- import.

module Data.Ruin.Ancillaries (
  -- * Type-level basics
  type (++),
  Difference,
  DifferenceByFst,
  Elem,
  Fst,
  Head,
  Intersection,
  MapFst,
  Snd,
  Tail,
  -- * Disjointedness
  DisjointFields,
  MustBeDisjoint,
  MustHaveNoExtras,
  -- * Search
  Find,
  FindViaFields,
  Loc(..),
  MergeLoc,
  MightHave,
  Pair(..),
  SearchBoth,
  unPair,
  -- * Generics
  GArgsHas,
  GBox,
  GFieldType,
  GFields,
  GFind,
  GenericBuildConArgs,
  IsABox,
  -- ** @GHC.Generics@ defaults
  GenericBuild,
  GenericFieldType,
  GenericFields,
  GenericHas,
  GenericShape,
  genericExtricate1,
  genericBuild,
  genericBuildNonStrict,

  -- * Proxied
  --
  -- Template Haskell doesn't yet support type applications, so these
  -- can be handy.
  phoid,
  prfrom,
  prto,
  -- * Miscellancy
  (:@)(..),
  FieldNames,
  IsSubtypeOf,
  IsSymmetricRecordOf,
  Gives(..),
  GiveAllItHas(..),
  GivesThese,
  GivesThis,
  Hoid,
  Label(..),
  Lemma_AppendGivesThese,
  SymmetricRecordsA,
  Tup1(..),
  mkLabel,
  rupEval,
  rupNonStrict,
  ) where

import Data.Ruin.All
import Data.Ruin.Hoid
import Data.Ruin.Internal