import Control.Monad
import Data.List
import Control.Concurrent
import GHC.Conc

splits xs = zip ( inits xs ) ( tails xs )

perms [] = return []
perms (x:xs) = do
    ys <- perms xs
    (pre,post) <- splits ys
    return $ pre ++ x:post

main = void $ forM [ 1 :: Int .. ] $ \ e -> do
    ch <- newChan
    void $ forM [ 1 .. GHC.Conc.numCapabilities ] $ \ t -> 
        writeChan ch $ length $ reverse $ perms $ take e  [ t .. ]
    out <- forM [ 1 .. GHC.Conc.numCapabilities ] $ \ t -> readChan ch
    print ( e, out )

