1{-# LANGUAGE AllowAmbiguousTypes #-}
2{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FunctionalDependencies #-}
4{-# LANGUAGE MonoLocalBinds #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
6{-# LANGUAGE PolyKinds #-}
7{-# LANGUAGE ScopedTypeVariables #-}
8{-# LANGUAGE TypeApplications #-}
9{-# LANGUAGE UndecidableInstances #-}
11-----------------------------------------------------------------------------
13-- Module : Data.Generics.Sum.Any
14-- Copyright : (C) 2017 Csongor Kiss
16-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
17-- Stability : experimental
18-- Portability : non-portable
20-- Derive a variety of prisms generically.
22-----------------------------------------------------------------------------
24module Data.Generics.Sum.Any
31import Data.Generics.Internal.Lens
32import Data.Generics.Sum.Constructors
33import Data.Generics.Sum.Typed
36-- == /Running example:/
38-- >>> :set -XTypeApplications
39-- >>> :set -XDataKinds
40-- >>> :set -XDeriveGeneric
41-- >>> import GHC.Generics
42-- >>> :m +Data.Generics.Internal.Lens
48-- deriving (Generic, Show)
54-- deriving (Generic, Show)
57-- dog, cat, duck :: Animal
58-- dog = Dog (MkDog "Shep" 3)
63-- |Sums that have generic prisms.
64class AsAny (sel :: k) a s | s sel k -> a where
65 -- |A prism that projects a sum as identified by some selector. Currently
66 -- supported selectors are constructor names and unique types. Compatible
67 -- with the lens package's 'Control.Lens.Prism' type.
69 -- >>> dog ^? _As @"Dog"
70 -- Just (MkDog {name = "Shep", age = 3})
72 -- >>> dog ^? _As @Dog
73 -- Just (MkDog {name = "Shep", age = 3})
75 -- >>> dog ^? _As @"Cat"
78 -- >>> cat ^? _As @(Name, Age)
81 -- >>> cat ^? _As @"Cat"
84 -- >>> _As @"Cat" # ("Garfield", 6) :: Animal
87 -- >>> duck ^? _As @Age
91instance AsConstructor ctor s s a a => AsAny ctor a s where
94instance AsType a s => AsAny a a s where
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list