packages feed

MicroHs-0.15.0.0: lib/Mhs/Builtin.hs

-- Copyright 2023-2025 Lennart Augustsson
-- See LICENSE file for full license.
module Mhs.Builtin(
  module Control.Monad,
  module Control.Monad.Fail,
  module Control.Monad.Fix,
  module Data.Bool,
  module Data.Char,
  module Data.Coerce,
  module Data.Data_Class,
  module Data.Enum,
  module Data.Eq,
--  module Data.Foldable,
  module Data.Fractional,
  module Data.Function,
  module Data.Functor,
  module Data.Ord,
  module Data.Num,
  module Data.Records,
  module Data.Typeable,
  module Data.Monoid.Internal,
  module Data.String,
  module Text.ParserCombinators.ReadPrec,
  module Text.Read.Internal,
  module Text.Read.Lex,
  module Text.Show,
  module Mhs.Builtin,
  ) where
--
-- These are the identifiers that can be generated by the compiler,
-- so they always have to be in scope.
-- In the compiler this module is treated specially, it is imported
-- qualified with the name B@, this way these names are always available
-- qualified, but under a name that cannot be used accidentally.
-- If the Prelude is not imported, then neither is this module.
import qualified Prelude()  -- no Prelude
import Control.Applicative(Applicative((<*>)))
import Control.Error(error)
import Control.Monad(Monad(..))
import Control.Monad.Fail(MonadFail(..))
import {-# SOURCE #-} Control.Monad.Fix(_mfix)
import Data.Bool((&&), Bool(..))
import Data.Char(Char)
import Data.Coerce(Coercible, coerce)
import Data.Data_Class(Data(..), Fixity(..), mkDataType, mkConstrTag, constrIndex)
import Data.Enum(Enum(enumFrom, enumFromThen, enumFromTo, enumFromThenTo))
import Data.Eq(Eq(..))
--import Data.Foldable(Foldable(..))
import qualified Data.Foldable
import Data.Fractional(Fractional(fromRational))
import Data.Function((.), id, flip)
import Data.Functor(Functor(..), (<$>))
import Data.Ord(Ord(..), Ordering(..))
import Data.Num(Num((+), (-), (*), fromInteger, negate))
import Data.Proxy(Proxy(..))
import Data.Monoid.Internal(Semigroup(..))
import Data.String(IsString(..))
import Data.Records(HasField(..), SetField(..), composeSet)
import Data.Traversable(Traversable(..))
import {-# SOURCE #-} Data.Typeable(Typeable(..), _mkTyCon, gcast1, gcast2)
import Text.ParserCombinators.ReadPrec((+++), pfail, prec, step, reset)
import Text.Read.Internal(Read(..), readListDefault, readListPrecDefault, parens, expectP, readField)
import Text.Read.Lex(Lexeme(..))
import Text.Show(Show(..), showString, showParen)

-- Types to fake unboxed sums
data USum2 a0 a1 = USum2_0 a0 | USum2_1 a1
data USum3 a0 a1 a2 = USum3_0 a0 | USum3_1 a1 | USum3_2 a2
data USum4 a0 a1 a2 a3 = USum4_0 a0 | USum4_1 a1 | USum4_2 a2 | USum4_3 a3

-- Types to fake unboxed tuples
data UProd0 = UProd0
newtype UProd1 a0 = UProd1 a0
data UProd2 a0 a1 = UProd2 a0 a1
data UProd3 a0 a1 a2 = UProd3 a0 a1 a2
data UProd4 a0 a1 a2 a3 = UProd4 a0 a1 a2 a3

-- Functions used for deriving Foldable
ffoldr :: Data.Foldable.Foldable f => (a -> b -> b) -> f a -> b -> b
ffoldr f = flip (Data.Foldable.foldr f)

flipConst :: a -> b -> b
flipConst _ b = b

foldTuple2 :: (a1 -> b -> b) -> (a2 -> b -> b) -> (a1, a2) -> b -> b
foldTuple2 f1 f2 (a1, a2) z = f1 a1 (f2 a2 z)

foldTuple3 :: (a1 -> b -> b) -> (a2 -> b -> b) -> (a3 -> b -> b) -> (a1, a2, a3) -> b -> b
foldTuple3 f1 f2 f3 (a1, a2, a3) z = f1 a1 (f2 a2 (f3 a3 z))

foldTuple4 :: (a1 -> b -> b) -> (a2 -> b -> b) -> (a3 -> b -> b) -> (a4 -> b -> b) -> (a1, a2, a3, a4) -> b -> b
foldTuple4 f1 f2 f3 f4 (a1, a2, a3, a4) z = f1 a1 (f2 a2 (f3 a3 (f4 a4 z)))

-- Functions used for deriving Functor
fmapTuple2 :: (a1 -> b1) -> (a2 -> b2) -> (a1, a2) -> (b1, b2)
fmapTuple2 f1 f2 (a1, a2) = (f1 a1, f2 a2)

fmapTuple3 :: (a1 -> b1) -> (a2 -> b2) -> (a3 -> b3) -> (a1, a2, a3) -> (b1, b2, b3)
fmapTuple3 f1 f2 f3 (a1, a2, a3) = (f1 a1, f2 a2, f3 a3)

fmapTuple4 :: (a1 -> b1) -> (a2 -> b2) -> (a3 -> b3) -> (a4 -> b4) -> (a1, a2, a3, a4) -> (b1, b2, b3, b4)
fmapTuple4 f1 f2 f3 f4 (a1, a2, a3, a4) = (f1 a1, f2 a2, f3 a3, f4 a4)

-- Functions used for deriving Traversable
travTuple2 :: Applicative f =>
              (a1 -> f b1) -> (a2 -> f b2) -> (a1, a2) -> f (b1, b2)
travTuple2 f1 f2 (a1, a2) = (,) <$> f1 a1 <*> f2 a2

travTuple3 :: Applicative f =>
              (a1 -> f b1) -> (a2 -> f b2) -> (a3 -> f b3) -> (a1, a2, a3) -> f (b1, b2, b3)
travTuple3 f1 f2 f3 (a1, a2, a3) = (,,) <$> f1 a1 <*> f2 a2 <*> f3 a3

travTuple4 :: Applicative f =>
              (a1 -> f b1) -> (a2 -> f b2) -> (a3 -> f b3) -> (a4 -> f b4) -> (a1, a2, a3, a4) -> f (b1, b2, b3, b4)
travTuple4 f1 f2 f3 f4 (a1, a2, a3, a4) = (,,,) <$> f1 a1 <*> f2 a2 <*> f3 a3 <*> f4 a4