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
37-- module Example where
39-- import Data.Generics.Sum
46-- deriving (Generic, Show)
52-- deriving (Generic, Show)
57-- dog, cat, duck :: Animal
59-- dog = Dog (MkDog "Shep" 3)
64-- |Sums that have generic prisms.
65class AsAny (sel :: k) a s | s sel k -> a where
66 -- |A prism that projects a sum as identified by some selector. Currently
67 -- supported selectors are constructor names and unique types. Compatible
68 -- with the lens package's 'Control.Lens.Prism' type.
70 -- >>> dog ^? _As @"Dog"
71 -- Just (MkDog {name = "Shep", age = 3})
72 -- >>> dog ^? _As @Dog
73 -- Just (MkDog {name = "Shep", age = 3})
74 -- >>> dog ^? _As @"Cat"
76 -- >>> cat ^? _As @(Name, Age)
78 -- >>> cat ^? _As @"Cat"
80 -- >>> _As @"Cat" # ("Garfield", 6) :: Animal
82 -- >>> duck ^? _As @Age
86instance AsConstructor ctor a s => AsAny ctor a s where
89instance 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