| Copyright | (c) Carter Schonwald 2013 |
|---|---|
| License | BSD3, see license file |
| Maintainer | libraries@haskell.org |
| Stability | experimental |
| Portability | portable |
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Darcs.Util.StrictIdentity
Description
Synopsis
- newtype StrictIdentity a = StrictIdentity {
- runStrictIdentity_ :: a
- runStrictIdentity :: StrictIdentity a -> a
Documentation
newtype StrictIdentity a Source #
StrictIdentity is a newtype wrapper for a given type a that
satisfies the Functor, Applicative, and Monad laws when restricted to
terminating strict computations.
The typical use case is to provide a light weight strict nested let notation for code that otherwise must use nested case expressions as a proxy for a strict let.
the general pattern is to write code of the form
foo f h g x y z = runStrictIdentity $! do
w <- return $! f x y
j <- return $! h w z
res <- return $! g w j
return res
An example usage of StrictIdentity that compiles to assembly
comparable to C is the following:
(>>) = unsafeShiftR
(<<) = unsafeShiftL
outerShuffle64A :: Word -> Word
outerShuffle64A !x =
runStrictIdentity $! do
x <- return $! ((x .&. 0x00000000FFFF0000) << 16 )
.|. ((x>>16) .&. 0x00000000FFFF0000) .|. (x .&. 0xFFFF00000000FFFF)
x <- return $! ((x .&. 0x0000FF000000FF00 ) << 8 )
.|. (x >> 8) .&. 0x0000FF000000FF00 .|. (x .&. 0xFF0000FFFF0000FF)
x<- return $! (( x .&. 0x00F000F000F000F0 ) << 4 )
.|. (x >> 4) .&. 0x00F000F000F000F0 .|. (x .&. 0xF00FF00FF00FF00F )
x<- return $!((x .&. 0x0C0C0C0C0C0C0C0C )<< 2 )
.|. (x >> 2) .&. 0x0C0C0C0C0C0C0C0C .|.( x .&. 0xC3C3C3C3C3C3C3C3)
x<- return $! ( (x .&. 0x2222222222222222) << 1 )
.|. (x>> 1) .&. 0x2222222222222222 .|. (x .&. 0x9999999999999999)
return x
Constructors
| StrictIdentity | |
Fields
| |
Instances
| MonadFix StrictIdentity Source # | |
Defined in Darcs.Util.StrictIdentity Methods mfix :: (a -> StrictIdentity a) -> StrictIdentity a # | |
| Applicative StrictIdentity Source # | |
Defined in Darcs.Util.StrictIdentity Methods pure :: a -> StrictIdentity a # (<*>) :: StrictIdentity (a -> b) -> StrictIdentity a -> StrictIdentity b # liftA2 :: (a -> b -> c) -> StrictIdentity a -> StrictIdentity b -> StrictIdentity c # (*>) :: StrictIdentity a -> StrictIdentity b -> StrictIdentity b # (<*) :: StrictIdentity a -> StrictIdentity b -> StrictIdentity a # | |
| Functor StrictIdentity Source # | |
Defined in Darcs.Util.StrictIdentity Methods fmap :: (a -> b) -> StrictIdentity a -> StrictIdentity b # (<$) :: a -> StrictIdentity b -> StrictIdentity a # | |
| Monad StrictIdentity Source # | |
Defined in Darcs.Util.StrictIdentity Methods (>>=) :: StrictIdentity a -> (a -> StrictIdentity b) -> StrictIdentity b # (>>) :: StrictIdentity a -> StrictIdentity b -> StrictIdentity b # return :: a -> StrictIdentity a # | |
runStrictIdentity :: StrictIdentity a -> a Source #
runStrictIdentity unwraps a value of type into a value of type StrictIdentity tyty, strictly.