Skip to content

Instantly share code, notes, and snippets.

@boj
Created October 19, 2017 09:48
Show Gist options
  • Save boj/dde1945097e89869159ba10fc2faa335 to your computer and use it in GitHub Desktop.
Save boj/dde1945097e89869159ba10fc2faa335 to your computer and use it in GitHub Desktop.
Haskell iso lens example
#! /usr/bin/env nix-shell
#! nix-shell -i 'runghc -XOverloadedStrings -XLambdaCase' -p 'ghc.withPackages (pkgs: [ pkgs.lens pkgs.text ])'
module Main where
import Control.Lens
import Data.Text
data Route
= ForgotPassword
| Logout
| GetUser Text
| FourOhFour
deriving (Show)
mkRoute :: [Text] -> Route
mkRoute = \case
["forgot"] -> ForgotPassword
["logout"] -> Logout
["user", uid] -> GetUser uid
_ -> FourOhFour
unMkRoute :: Route -> [Text]
unMkRoute = \case
ForgotPassword -> ["forgot"]
Logout -> ["logout"]
GetUser uid -> ["user", uid]
FourOhFour -> ["404"]
routeIso :: Iso' [Text] Route
routeIso = iso mkRoute unMkRoute
main :: IO ()
main = do
print $ view routeIso ["logout"]
print $ view routeIso ["nonsense"]
print $ view (from routeIso) ForgotPassword
@boj
Copy link
Author

boj commented Oct 19, 2017

Output:

$ ./Main.hs
Logout
FourOhFour
["forgot"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment