strict-identity-0.1.0.0: Strict Identity Monad, handy for writing fast code!

Copyright(c) Carter Schonwald 2013
LicenseBSD3, see license file
Maintainerlibraries@haskell.org
Stabilityexperimental
Portabilityportable
Safe HaskellSafe-Inferred
LanguageHaskell2010

Control.Monad.StrictIdentity

Description

 

Synopsis

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

runStrictIdentity_ :: a
 

runStrictIdentity :: StrictIdentity a -> a Source

runStrictIdentity unwraps a value of type StrictIdentity ty into a value of type ty, strictly.