The strict-identity package

[maintain]

strict Identity monad for writing strict performant code sanely


[Skip to ReadMe]

Properties

Versions0.1.0.0, 0.1.0.0
Dependenciesbase (>=4.3 && <4.8) [details]
LicenseBSD3
AuthorCarter Tazio Schonwald
Maintainercarter at wellposed.com
CategoryControl
Home pagehttps://github.com/cartazio/strict-identity
Source repositoryhead: git clone http://github.com/cartazio/strict-identity.git
UploadedSun Jan 12 08:19:45 UTC 2014 by CarterSchonwald

Modules

[Index]

Downloads

Maintainers' corner

For package maintainers and hackage trustees

Readme for strict-identity-0.1.0.0

Build Status

#About

strict-identity package is meant to make writing nested strict let expression heavy code a bit more pleasant, for all those High Performance Haskell lib authors out there.

A simple example of the strict identity monad in action (and working wonderfully) is the following bit fiddling code, which generates C competitive assembly on both major GHC backends, -fasm and -fllvm

(>>) = 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