summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfredefox <>2017-05-19 20:32:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2017-05-19 20:32:00 (GMT)
commit138d4f35d4945ba7edaf58e78734ee74c9a53872 (patch)
tree418028d908fe150eb5bc625199fe7896777457b8
parent4aa35ca6f523d9c3e15e7ba5287a1117c2e33892 (diff)
version 0.1.0.40.1.0.4
-rw-r--r--Example.lhs (renamed from README)0
-rw-r--r--README.md54
-rw-r--r--shade.cabal5
3 files changed, 57 insertions, 2 deletions
diff --git a/README b/Example.lhs
index e4ed566..e4ed566 100644
--- a/README
+++ b/Example.lhs
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a9290d0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,54 @@
+``` {.sourceCode .literate .haskell}
+{-# 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:
+
+``` {.sourceCode .literate .haskell}
+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:
+
+``` {.sourceCode .literate .haskell}
+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`:
+
+``` {.sourceCode .literate .haskell}
+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.
+
+``` {.sourceCode .literate .haskell}
+noisy :: String -> Shade Identity (IO ())
+noisy s = pure (putStrLn s)
+```
+
+``` {.sourceCode .literate .haskell}
+main :: IO ()
+main = do
+ r <- runInIO hetero
+ putStrLn r
+ join . runInIO . mconcat . map (noisy . show) $ [0..10]
+```
diff --git a/shade.cabal b/shade.cabal
index 998e3b6..9b0bd95 100644
--- a/shade.cabal
+++ b/shade.cabal
@@ -1,5 +1,5 @@
name: shade
-version: 0.1.0.3
+version: 0.1.0.4
synopsis: A control structure used to combine heterogenous types with delayed effects.
description: Please see the README.
homepage: https://github.com/fredefox/shade#readme
@@ -10,7 +10,8 @@ maintainer: fhi.1990@gmail.com
copyright: Copyright: (c) 2017 Frederik Hanghøj Iversen
category: Web
build-type: Simple
-extra-source-files: README
+extra-source-files: README.md
+extra-source-files: Example.lhs
cabal-version: >=1.10
library