X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIO.hs;h=578d2d2bacb2555b5645f0a906c747d37d991827;hb=ab846356309481d85c622e2306d2f043f12bc6cc;hp=c805004f8af69fb922304660de18a6e18f008ec6;hpb=3f6fd26597b7c0e45a8ac51aa07ff1f07b8f7111;p=ghc-base.git diff --git a/GHC/IO.hs b/GHC/IO.hs index c805004..578d2d2 100644 --- a/GHC/IO.hs +++ b/GHC/IO.hs @@ -1,5 +1,4 @@ -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-# OPTIONS_GHC -fno-implicit-prelude -funbox-strict-fields #-} +{-# OPTIONS_GHC -XNoImplicitPrelude -funbox-strict-fields -XBangPatterns #-} {-# OPTIONS_HADDOCK hide #-} ----------------------------------------------------------------------------- -- | @@ -17,7 +16,7 @@ -- #hide module GHC.IO ( - IO(..), unIO, failIO, liftIO, bindIO, thenIO, returnIO, + IO(..), unIO, failIO, liftIO, unsafePerformIO, unsafeInterleaveIO, unsafeDupablePerformIO, unsafeDupableInterleaveIO, noDuplicate, @@ -65,40 +64,9 @@ Libraries - parts of hslibs/lang. --SDM -} -unIO :: IO a -> (State# RealWorld -> (# State# RealWorld, a #)) -unIO (IO a) = a - -instance Functor IO where - fmap f x = x >>= (return . f) - -instance Monad IO where - {-# INLINE return #-} - {-# INLINE (>>) #-} - {-# INLINE (>>=) #-} - m >> k = m >>= \ _ -> k - return x = returnIO x - - m >>= k = bindIO m k - fail s = failIO s - liftIO :: IO a -> State# RealWorld -> STret RealWorld a liftIO (IO m) = \s -> case m s of (# s', r #) -> STret s' r -bindIO :: IO a -> (a -> IO b) -> IO b -bindIO (IO m) k = IO ( \ s -> - case m s of - (# new_s, a #) -> unIO (k a) new_s - ) - -thenIO :: IO a -> IO b -> IO b -thenIO (IO m) k = IO ( \ s -> - case m s of - (# new_s, _ #) -> unIO k new_s - ) - -returnIO :: a -> IO a -returnIO x = IO (\ s -> (# s, x #)) - failIO :: String -> IO a failIO s = IO (raiseIO# (toException (userError s))) @@ -367,7 +335,4 @@ a `finally` sequel = -- > evaluate x = (return $! x) >>= return -- evaluate :: a -> IO a -evaluate a = IO $ \s -> case a `seq` () of () -> (# s, a #) - -- NB. can't write - -- a `seq` (# s, a #) - -- because we can't have an unboxed tuple as a function argument +evaluate a = IO $ \s -> let !va = a in (# s, va #) -- NB. see #2273