singletons-1.0: src/Data/Singletons/Prelude.hs
-----------------------------------------------------------------------------
-- |
-- Module : Data.Singletons.Prelude
-- Copyright : (C) 2013 Richard Eisenberg
-- License : BSD-style (see LICENSE)
-- Maintainer : Richard Eisenberg (eir@cis.upenn.edu)
-- Stability : experimental
-- Portability : non-portable
--
-- Mimics the Haskell Prelude, but with singleton types. Includes the basic
-- singleton definitions. Note: This is currently very incomplete!
--
-- Because many of these definitions are produced by Template Haskell, it is
-- not possible to create proper Haddock documentation. Also, please excuse
-- the apparent repeated variable names. This is due to an interaction between
-- Template Haskell and Haddock.
--
----------------------------------------------------------------------------
{-# LANGUAGE ExplicitNamespaces #-}
module Data.Singletons.Prelude (
-- * Basic singleton definitions
module Data.Singletons,
Sing(SFalse, STrue, SNil, SCons, SJust, SNothing, SLeft, SRight, SLT, SEQ, SGT,
STuple0, STuple2, STuple3, STuple4, STuple5, STuple6, STuple7),
-- | Though Haddock doesn't show it, the 'Sing' instance above includes
-- the following instances
--
-- > data instance Sing (a :: Bool) where
-- > SFalse :: Sing False
-- > STrue :: Sing True
-- >
-- > data instance Sing (a :: [k]) where
-- > SNil :: Sing '[]
-- > SCons :: Sing (h :: k) -> Sing (t :: [k]) -> Sing (h ': t)
-- >
-- > data instance Sing (a :: Maybe k) where
-- > SNothing :: Sing Nothing
-- > SJust :: Sing (a :: k) -> Sing (Just a)
-- >
-- > data instance Sing (a :: Either x y) where
-- > SLeft :: Sing (a :: x) -> Sing (Left a)
-- > SRight :: Sing (b :: y) -> Sing (Right b)
-- >
-- > data instance Sing (a :: Ordering) where
-- > SLT :: Sing LT
-- > SEQ :: Sing EQ
-- > SGT :: Sing GT
-- >
-- > data instance Sing (a :: ()) where
-- > STuple0 :: Sing '()
-- >
-- > data instance Sing (z :: (a, b)) where
-- > STuple2 :: Sing a -> Sing b -> Sing '(a, b)
-- >
-- > data instance Sing (z :: (a, b, c)) where
-- > STuple3 :: Sing a -> Sing b -> Sing c -> Sing '(a, b, c)
-- >
-- > data instance Sing (z :: (a, b, c, d)) where
-- > STuple4 :: Sing a -> Sing b -> Sing c -> Sing d -> Sing '(a, b, c, d)
-- >
-- > data instance Sing (z :: (a, b, c, d, e)) where
-- > STuple5 :: Sing a -> Sing b -> Sing c -> Sing d -> Sing e -> Sing '(a, b, c, d, e)
-- >
-- > data instance Sing (z :: (a, b, c, d, e, f)) where
-- > STuple6 :: Sing a -> Sing b -> Sing c -> Sing d -> Sing e -> Sing f
-- > -> Sing '(a, b, c, d, e, f)
-- >
-- > data instance Sing (z :: (a, b, c, d, e, f, g)) where
-- > STuple7 :: Sing a -> Sing b -> Sing c -> Sing d -> Sing e -> Sing f
-- > -> Sing g -> Sing '(a, b, c, d, e, f, g)
-- * Singleton type synonyms
-- | These synonyms are all kind-restricted synonyms of 'Sing'.
-- For example 'SBool' requires an argument of kind 'Bool'.
SBool, SList, SMaybe, SEither, SOrdering,
STuple0, STuple2, STuple3, STuple4, STuple5, STuple6, STuple7,
-- * Functions working with 'Bool'
If, sIf, Not, sNot, (:&&), (:||), (%:&&), (%:||), Otherwise, sOtherwise,
-- * Error reporting
Error, ErrorSym0, sError,
-- * Singleton equality
module Data.Singletons.Prelude.Eq,
-- * Singleton comparisons
module Data.Singletons.Prelude.Ord,
-- ** Miscellaneous functions
Id, sId, Const, sConst, (:.), (%:.), type ($), (%$), type ($!), (%$!),
Flip, sFlip, AsTypeOf, sAsTypeOf,
Seq, sSeq,
-- * List operations
Map, sMap, (:++), (%:++), Head, sHead, Last, sLast, Tail, sTail,
Init, sInit, Null, sNull, Reverse, sReverse,
-- ** Reducing lists (folds)
Foldl, sFoldl, Foldl1, sFoldl1, Foldr, sFoldr, Foldr1, sFoldr1,
-- *** Special folds
And, sAnd, Or, sOr, Any_, sAny_, All, sAll,
Concat, sConcat, ConcatMap, sConcatMap,
-- *** Scans
Scanl, sScanl, Scanl1, sScanl1, Scanr, sScanr, Scanr1, sScanr1,
-- ** Searching lists
Elem, sElem, NotElem, sNotElem,
-- ** Zipping and unzipping lists
Zip, sZip, Zip3, sZip3, ZipWith, sZipWith, ZipWith3, sZipWith3,
Unzip, sUnzip, Unzip3, sUnzip3,
-- * Other datatypes
Maybe_, sMaybe_,
Either_, sEither_,
Fst, sFst, Snd, sSnd, Curry, sCurry, Uncurry, sUncurry,
Symbol,
-- * Other functions
either_, -- reimplementation of either to be used with singletons library
maybe_,
bool_,
any_,
-- * Defunctionalization symbols
FalseSym0, TrueSym0,
NotSym0, NotSym1, (:&&$), (:&&$$), (:&&$$$), (:||$), (:||$$), (:||$$$),
OtherwiseSym0,
NothingSym0, JustSym0, JustSym1,
Maybe_Sym0, Maybe_Sym1, Maybe_Sym2, Maybe_Sym3,
LeftSym0, LeftSym1, RightSym0, RightSym1,
Either_Sym0, Either_Sym1, Either_Sym2, Either_Sym3,
Tuple0Sym0,
Tuple2Sym0, Tuple2Sym1, Tuple2Sym2,
Tuple3Sym0, Tuple3Sym1, Tuple3Sym2, Tuple3Sym3,
Tuple4Sym0, Tuple4Sym1, Tuple4Sym2, Tuple4Sym3, Tuple4Sym4,
Tuple5Sym0, Tuple5Sym1, Tuple5Sym2, Tuple5Sym3, Tuple5Sym4, Tuple5Sym5,
Tuple6Sym0, Tuple6Sym1, Tuple6Sym2, Tuple6Sym3, Tuple6Sym4, Tuple6Sym5, Tuple6Sym6,
Tuple7Sym0, Tuple7Sym1, Tuple7Sym2, Tuple7Sym3, Tuple7Sym4, Tuple7Sym5, Tuple7Sym6, Tuple7Sym7,
FstSym0, FstSym1, SndSym0, SndSym1,
CurrySym0, CurrySym1, CurrySym2, CurrySym3,
UncurrySym0, UncurrySym1, UncurrySym2,
IdSym0, IdSym1, ConstSym0, ConstSym1, ConstSym2,
(:.$), (:.$$), (:.$$$),
type ($$), type ($$$), type ($$$$),
type ($!$), type ($!$$), type ($!$$$),
FlipSym0, FlipSym1, FlipSym2,
AsTypeOfSym0, AsTypeOfSym1, AsTypeOfSym2, SeqSym0, SeqSym1, SeqSym2,
(:$), (:$$), (:$$$), NilSym0, ConsSym0, ConsSym1, ConsSym2,
MapSym0, MapSym1, MapSym2, ReverseSym0, ReverseSym1,
(:++$$), (:++$), HeadSym0, HeadSym1, LastSym0, LastSym1,
TailSym0, TailSym1, InitSym0, InitSym1, NullSym0, NullSym1,
FoldlSym0, FoldlSym1, FoldlSym2, FoldlSym3,
Foldl1Sym0, Foldl1Sym1, Foldl1Sym2,
FoldrSym0, FoldrSym1, FoldrSym2, FoldrSym3,
Foldr1Sym0, Foldr1Sym1, Foldr1Sym2,
ConcatSym0, ConcatSym1,
ConcatMapSym0, ConcatMapSym1, ConcatMapSym2,
AndSym0, AndSym1, OrSym0, OrSym1,
Any_Sym0, Any_Sym1, Any_Sym2,
AllSym0, AllSym1, AllSym2,
ScanlSym0, ScanlSym1, ScanlSym2, ScanlSym3,
Scanl1Sym0, Scanl1Sym1, Scanl1Sym2,
ScanrSym0, ScanrSym1, ScanrSym2, ScanrSym3,
Scanr1Sym0, Scanr1Sym1, Scanr1Sym2,
ElemSym0, ElemSym1, ElemSym2,
NotElemSym0, NotElemSym1, NotElemSym2,
ZipSym0, ZipSym1, ZipSym2,
Zip3Sym0, Zip3Sym1, Zip3Sym2, Zip3Sym3,
ZipWithSym0, ZipWithSym1, ZipWithSym2, ZipWithSym3,
ZipWith3Sym0, ZipWith3Sym1, ZipWith3Sym2, ZipWith3Sym3,
UnzipSym0, UnzipSym1
) where
import Data.Singletons
import Data.Singletons.Prelude.Base
import Data.Singletons.Prelude.Bool
import Data.Singletons.Prelude.Either
import Data.Singletons.Prelude.List
import Data.Singletons.Prelude.Maybe
import Data.Singletons.Prelude.Tuple
import Data.Singletons.Prelude.Eq
import Data.Singletons.Prelude.Ord
import Data.Singletons.Prelude.Instances
import Data.Singletons.TypeLits