{-# LANGUAGE ExplicitNamespaces #-}

-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Promotion.Prelude.List.NonEmpty
-- Copyright   :  (C) 2016 Richard Eisenberg
-- License     :  BSD-style (see LICENSE)
-- Maintainer  :  Richard Eisenberg (rae@cs.brynmawr.edu)
-- Stability   :  experimental
-- Portability :  non-portable
--
-- Defines functions and datatypes relating to promoting 'NonEmpty',
-- including promoted versions of many of the definitions in @Data.List.NonEmpty@.
--
----------------------------------------------------------------------------

module Data.Promotion.Prelude.List.NonEmpty (

  -- * Non-empty stream transformations
  Map,
  Intersperse,
  Scanl,
  Scanr,
  Scanl1,
  Scanr1,
  Transpose,
  SortBy,
  SortWith,
  Length,
  Head,
  Tail,
  Last,
  Init,
  type (<|),
  Cons,
  Uncons,
  Unfoldr,
  Sort,
  Reverse,
  Inits,
  Tails,
  Unfold,
  Insert,
  Take,
  Drop,
  SplitAt,
  TakeWhile,
  DropWhile,
  Span,
  Break,
  Filter,
  Partition,
  Group,
  GroupBy,
  GroupWith,
  GroupAllWith,
  Group1,
  GroupBy1,
  GroupWith1,
  GroupAllWith1,
  IsPrefixOf,
  Nub,
  NubBy,
  type (!!),
  Zip,
  ZipWith,
  Unzip,
  FromList,
  ToList,
  NonEmpty_,
  Xor,

  -- * Defunctionalization symbols
  (:|@#@$), (:|@#@$$), (:|@#@$$$),
  MapSym0, MapSym1, MapSym2,
  IntersperseSym0, IntersperseSym1, IntersperseSym2,
  ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3,
  ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3,
  Scanl1Sym0, Scanl1Sym1, Scanl1Sym2,
  Scanr1Sym0, Scanr1Sym1, Scanr1Sym2,
  TransposeSym0, TransposeSym1,
  SortBySym0, SortBySym1, SortBySym2,
  SortWithSym0, SortWithSym1, SortWithSym2,
  LengthSym0, LengthSym1,
  HeadSym0, HeadSym1,
  TailSym0, TailSym1,
  LastSym0, LastSym1,
  InitSym0, InitSym1,
  type (<|@#@$), type (<|@#@$$), type (<|@#@$$$),
  ConsSym0, ConsSym1, ConsSym2,
  UnconsSym0, UnconsSym1,
  UnfoldrSym0, UnfoldrSym1, UnfoldrSym2,
  SortSym0, SortSym1,
  ReverseSym0, ReverseSym1,
  InitsSym0, InitsSym1,
  TailsSym0, TailsSym1,
  UnfoldSym0, UnfoldSym1,
  InsertSym0, InsertSym1, InsertSym2,
  TakeSym0, TakeSym1, TakeSym2,
  DropSym0, DropSym1, DropSym2,
  SplitAtSym0, SplitAtSym1, SplitAtSym2,
  TakeWhileSym0, TakeWhileSym1, TakeWhileSym2,
  DropWhileSym0, DropWhileSym1, DropWhileSym2,
  SpanSym0, SpanSym1, SpanSym2,
  BreakSym0, BreakSym1, BreakSym2,
  FilterSym0, FilterSym1, FilterSym2,
  PartitionSym0, PartitionSym1, PartitionSym2,
  GroupSym0, GroupSym1,
  GroupBySym0, GroupBySym1, GroupBySym2,
  GroupWithSym0, GroupWithSym1, GroupWithSym2,
  GroupAllWithSym0, GroupAllWithSym1, GroupAllWithSym2,
  Group1Sym0, Group1Sym1,
  GroupBy1Sym0, GroupBy1Sym1, GroupBy1Sym2,
  GroupWith1Sym0, GroupWith1Sym1, GroupWith1Sym2,
  GroupAllWith1Sym0, GroupAllWith1Sym1, GroupAllWith1Sym2,
  IsPrefixOfSym0, IsPrefixOfSym1, IsPrefixOfSym2,
  NubSym0, NubSym1,
  NubBySym0, NubBySym1, NubBySym2,
  type (!!@#@$), type (!!@#@$$), type (!!@#@$$$),
  ZipSym0, ZipSym1, ZipSym2,
  ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3,
  UnzipSym0, UnzipSym1,
  FromListSym0, FromListSym1,
  ToListSym0, ToListSym1,
  NonEmpty_Sym0, NonEmpty_Sym1,
  XorSym0, XorSym1
  ) where

import Data.Singletons.Prelude.List.NonEmpty