module Internal.Interlude (module X, module Internal.Interlude) where

import Prelude as X hiding (show, id, head, putStrLn, print, readFile)
import qualified Prelude
import Data.Proxy as X
import Data.Kind as X
import Data.Semigroup as X hiding (Min, Max)
import Data.Text as X (Text)
import Data.ByteString as X (ByteString)
import Control.Lens as X (makeLenses, (^.), (.~), (%~), (^?), view, lensRules)
import Data.String.Conv as X
import Data.Function as X hiding (id)
import Data.Char as X
import Data.List as X hiding (head, insert)
import Data.Maybe as X
import Debug.Trace as X
import Data.String as X (IsString(..))
import Data.Aeson as X
import Data.Ord as X (Down(..))
import Data.Coerce as X
import Data.Bifunctor as X
import GHC.TypeLits as X (TypeError)
import Control.Monad.State as X (evalState, get, modify')
import Control.Monad.IO.Class as X
import Control.Monad as X
import Data.Functor.Identity as X
import qualified Data.Text.IO as Text
import Data.Foldable as X

show :: (Show a, IsString c) => a -> c
show = fromString . Prelude.show

identity :: a -> a
identity = Prelude.id
{-# INLINE identity #-}

head :: [a] -> Maybe a
head = listToMaybe
{-# INLINE head #-}

unsafeHead :: [a] -> a
unsafeHead = Prelude.head
{-# INLINE unsafeHead #-}

putStrLn :: MonadIO m => String -> m ()
putStrLn = liftIO . Prelude.putStrLn

print :: (MonadIO m, Show a) => a -> m ()
print = liftIO . Prelude.print

putText :: MonadIO m => Text -> m ()
putText = putStrLn . toS

readFile :: FilePath -> IO Text
readFile = Text.readFile

foldl1Def :: (a -> a -> a) -> a -> [a] -> a
foldl1Def _ d [] = d
foldl1Def f _ as = foldl1' f as