shade: A control structure used to combine heterogenous types with delayed effects.

[ bsd3, control, library ] [ Propose Tags ]

Please see the README.


[Skip to Readme]
Versions [faq] 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) [details]
License BSD-3-Clause
Copyright Copyright: (c) 2017 Frederik Hanghøj Iversen
Author Frederik Hanghøj Iversen
Maintainer fhi.1990@gmail.com
Revised Revision 1 made by HerbertValerioRiedel at 2017-05-19T21:07:19Z
Category Web
Home page https://github.com/fredefox/shade#readme
Source repo head: git clone https://github.com/fredefox/shade
Uploaded by fredefox at 2017-05-19T20:27:51Z
Distributions NixOS:0.1.1.1
Downloads 4473 total (4 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2017-05-19 [all 1 reports]

Modules

[Index]

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees


Readme for shade-0.1.0.3

[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]