Merge pull request #9 from jmackie/readme-test

Test the README
This commit is contained in:
Tom Harding 2019-06-24 08:50:14 +01:00 committed by GitHub
commit 9c7b830bdc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 7 deletions

1
README.lhs Symbolic link
View File

@ -0,0 +1 @@
README.md

View File

@ -9,7 +9,7 @@ When we work with [higher-kinded
data](https://reasonablypolymorphic.com/blog/higher-kinded-data), we find data](https://reasonablypolymorphic.com/blog/higher-kinded-data), we find
ourselves writing types like: ourselves writing types like:
```haskell ```{haskell, ignore}
data User f data User f
= User = User
{ name :: f String { name :: f String
@ -24,7 +24,7 @@ lot of boilerplate deriving to do. Wouldn't it be nice if we could get back to
writing simple types as we know and love them, and get all this stuff for writing simple types as we know and love them, and get all this stuff for
_free_? _free_?
```haskell ```{haskell, ignore}
data User data User
= User = User
{ name :: String { name :: String
@ -50,7 +50,7 @@ example data types:
{-# LANGUAGE DataKinds #-} {-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeApplications #-}
module Example where module Main where
import Control.Lens ((.~), (^.), (&), Const (..), Identity, anyOf) import Control.Lens ((.~), (^.), (&), Const (..), Identity, anyOf)
import Data.Functor.Const (Const (..)) import Data.Functor.Const (Const (..))
@ -124,7 +124,7 @@ Of course, this method requires every field to be monoidal. If we try with
`Identity`, for example, we're in trouble if all our fields aren't themselves `Identity`, for example, we're in trouble if all our fields aren't themselves
monoids: monoids:
```haskell ```{haskell, ignore}
eg2 :: Bare Triple eg2 :: Bare Triple
eg2 = mempty eg2 = mempty
-- error: -- error:
@ -196,7 +196,7 @@ choice):
```haskell ```haskell
eg9 :: Partial User eg9 :: Partial User
eg9 = eg0 & field @"name" .~ pure "Evil Tom" eg9 = eg0 & field @"name" .~ pure "Evil Tom"
& field @"likesDogs" .~ pure False & field @"likesDogs" .~ pure False
-- User -- User
-- { name = Last {getLast = Just "Evil Tom"} -- { name = Last {getLast = Just "Evil Tom"}
-- , age = Last {getLast = Nothing} -- , age = Last {getLast = Nothing}
@ -217,7 +217,7 @@ Finally, thanks to the fact that this library exploits some of the internals of
`generic-lens`, we'll also get a nice type error when we mention a field that `generic-lens`, we'll also get a nice type error when we mention a field that
doesn't exist in our type: doesn't exist in our type:
```haskell ```{haskell, ignore}
eg11 :: Identity () eg11 :: Identity ()
eg11 = eg3 ^. field @"oops" eg11 = eg3 ^. field @"oops"
-- error: -- error:
@ -254,7 +254,7 @@ eg13 = eg9 & position @2 .~ pure 25
Similarly, the internals here come to us courtesy of `generic-lens`, so the Similarly, the internals here come to us courtesy of `generic-lens`, so the
type errors are a delight: type errors are a delight:
```haskell ```{haskell, ignore}
eg14 :: Identity () eg14 :: Identity ()
eg14 = deconstruct @Identity triple ^. position @4 eg14 = deconstruct @Identity triple ^. position @4
-- error: -- error:
@ -288,3 +288,14 @@ eg16 :: [String]
eg16 = labelsWhere (isNothing . getLast) eg9 eg16 = labelsWhere (isNothing . getLast) eg9
-- ["age"] -- ["age"]
``` ```
### Documentation
All the docs in this library are tested on `cabal new-test`. Furthermore, this
README is tested by `markdown-unlit`. To keep _that_ happy, we do need a `main`
in this file, so just ignore the following :)
```haskell
main :: IO ()
main = pure ()
```

View File

@ -42,3 +42,14 @@ test-suite test
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0
hs-source-dirs: test hs-source-dirs: test
default-language: Haskell2010 default-language: Haskell2010
test-suite readme
build-depends: base
, barbies ^>= 1.1.0
, lens ^>= 4.17
, higgledy
main-is: README.lhs
type: exitcode-stdio-1.0
default-language: Haskell2010
ghc-options: -pgmL markdown-unlit -Wall
build-tool-depends: markdown-unlit:markdown-unlit