The shade package

[ Tags: bsd3, control, library ] [ Propose Tags ]

Please see the README.


[Skip to Readme]

Properties

Versions 0.1.0.0, 0.1.0.1, 0.1.0.2, 0.1.0.3, 0.1.0.4, 0.1.1.0, 0.1.1.1
Dependencies base (>=4.8 && <5), mtl (>=2.2.1), transformers (>=0.5.2.0) [details]
License BSD3
Copyright Copyright: (c) 2017 Frederik Hanghøj Iversen
Author Frederik Hanghøj Iversen
Maintainer fhi.1990@gmail.com
Category Control
Home page https://github.com/fredefox/shade#readme
Source repository head: git clone https://github.com/fredefox/shade
Uploaded Sat May 20 19:03:30 UTC 2017 by fredefox
Updated Sun May 21 07:14:14 UTC 2017 by HerbertValerioRiedel to revision 1
Distributions NixOS:0.1.1.1
Downloads 319 total (18 in the last 30 days)
Rating 0.0 (0 ratings) [clear rating]
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2017-05-20 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for shade-0.1.1.1

[back to package description]
{-# LANGUAGE MultiParamTypeClasses #-}
module Main ( main ) where

import Data.Functor.Identity
import Control.Monad

import Control.Monad.Shade

A shade can be used to save heterogeneous types in containers with the same type e.g. using a type-class as a common denominator:

showshade :: Applicative m => Show a => a -> Shade m String
showshade a = pure (show a)

hetero :: Shade Identity String
hetero = mconcat [ showshade () , showshade 2 , showshade "hej" ]

The values inside a shade are stored in a context. We can swap this context by defining a transfer function:

idToIO :: Identity b -> IO b
idToIO (Identity v) = putStrLn "Transferring" *> pure v

The context is switched using transfer and we can access the value in this new context by using shadow:

runInIO :: Shade Identity a -> IO a
runInIO = shadow . transfer idToIO

The point to note about this example is that the values are stored in an shades with the identity as context. We can manipulate this context including the value. We cannot, however inspect the value since it is universally quantified.

noisy :: String -> Shade Identity (IO ())
noisy s = pure (putStrLn s)
main :: IO ()
main = do
  r <- runInIO hetero
  putStrLn r
  join . runInIO . mconcat . map (noisy . show) $ [0..10]