labels 0.1.2 → 0.2.0
raw patch · 4 files changed
+85/−14 lines, 4 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Labels: class Reflect (c :: * -> Constraint) r
+ Labels: labels :: Reflect Ignore r => r -> [String]
+ Labels: reflect :: forall b. Reflect c r => (forall a. c a => a -> b) -> r -> [(String, b)]
+ Labels.Internal: class Ignore a
+ Labels.Internal: class Reflect (c :: * -> Constraint) r
+ Labels.Internal: ignore :: Ignore a => a -> ()
+ Labels.Internal: instance (c v1, c v2) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2)
+ Labels.Internal: instance (c v1, c v2, c v3) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18, c v19) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18, l19 Labels.Internal.:= v19)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18, c v19, c v20) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18, l19 Labels.Internal.:= v19, l20 Labels.Internal.:= v20)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18, c v19, c v20, c v21) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18, l19 Labels.Internal.:= v19, l20 Labels.Internal.:= v20, l21 Labels.Internal.:= v21)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18, c v19, c v20, c v21, c v22) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18, l19 Labels.Internal.:= v19, l20 Labels.Internal.:= v20, l21 Labels.Internal.:= v21, l22 Labels.Internal.:= v22)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18, c v19, c v20, c v21, c v22, c v23) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18, l19 Labels.Internal.:= v19, l20 Labels.Internal.:= v20, l21 Labels.Internal.:= v21, l22 Labels.Internal.:= v22, l23 Labels.Internal.:= v23)
+ Labels.Internal: instance (c v1, c v2, c v3, c v4, c v5, c v6, c v7, c v8, c v9, c v10, c v11, c v12, c v13, c v14, c v15, c v16, c v17, c v18, c v19, c v20, c v21, c v22, c v23, c v24) => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1, l2 Labels.Internal.:= v2, l3 Labels.Internal.:= v3, l4 Labels.Internal.:= v4, l5 Labels.Internal.:= v5, l6 Labels.Internal.:= v6, l7 Labels.Internal.:= v7, l8 Labels.Internal.:= v8, l9 Labels.Internal.:= v9, l10 Labels.Internal.:= v10, l11 Labels.Internal.:= v11, l12 Labels.Internal.:= v12, l13 Labels.Internal.:= v13, l14 Labels.Internal.:= v14, l15 Labels.Internal.:= v15, l16 Labels.Internal.:= v16, l17 Labels.Internal.:= v17, l18 Labels.Internal.:= v18, l19 Labels.Internal.:= v19, l20 Labels.Internal.:= v20, l21 Labels.Internal.:= v21, l22 Labels.Internal.:= v22, l23 Labels.Internal.:= v23, l24 Labels.Internal.:= v24)
+ Labels.Internal: instance Labels.Internal.Ignore a
+ Labels.Internal: instance c v1 => Labels.Internal.Reflect c (l1 Labels.Internal.:= v1)
+ Labels.Internal: labels :: Reflect Ignore r => r -> [String]
+ Labels.Internal: reflect :: forall b. Reflect c r => (forall a. c a => a -> b) -> r -> [(String, b)]
Files
- CHANGELOG +4/−0
- labels.cabal +2/−2
- src/Labels.hs +15/−1
- src/Labels/Internal.hs +64/−11
CHANGELOG view
@@ -1,3 +1,7 @@+0.2.0:+ * Add "reflect" and "labels" functions.+ * Drop support for GHC <8.+ 0.1.2: * Add docs for "project" function.
labels.cabal view
@@ -1,5 +1,5 @@ name: labels-version: 0.1.2+version: 0.2.0 synopsis: Anonymous records via named tuples description: Declare and access tuple fields with labels. An approach to anonymous records. homepage: https://github.com/chrisdone/labels#readme@@ -19,7 +19,7 @@ ghc-options: -Wall -O2 exposed-modules: Labels, Labels.Internal- build-depends: base >= 4.7 && < 5,+ build-depends: base >= 4.9.0.0 && < 5, template-haskell default-language: Haskell2010
src/Labels.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE KindSignatures #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE Rank2Types #-}+{-# LANGUAGE OverloadedLabels #-} -- | Labels for fields in a tuple. -- -- Enable these extensions:@@ -64,6 +65,16 @@ -- -- >>> project (#bar := "hello", #foo := 3) :: ("foo" := Int, "bar" := String) -- (#foo := 3,#bar := "hello")+--+-- Reflection of labels+--+-- >>> labels (#bar := "hello", #foo := 3, #mu := "hi")+-- ["bar","foo","mu"]+--+-- Reflection of labelled fields+--+-- >>> reflect @Show show (#bar := "hello", #foo := 3, #mu := "hi")+-- [("bar","\"hello\""),("foo","3"),("mu","\"hi\"")] module Labels -- Field access@@ -73,11 +84,14 @@ , lens , cons , project+ , reflect+ , labels -- Construction , (:=)(..) , Has , Cons- , Project)+ , Project+ , Reflect) where import Data.Proxy
src/Labels/Internal.hs view
@@ -1,3 +1,6 @@+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE Rank2Types #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE TypeFamilies #-}@@ -12,11 +15,11 @@ {-# LANGUAGE KindSignatures #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleInstances #-}-#if __GLASGOW_HASKELL__ >= 800-{-# LANGUAGE OverloadedLabels #-}-#endif {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedLabels #-}+ {-# OPTIONS_GHC -fno-warn-orphans #-} -- | This module provides a way to name the fields in a regular@@ -26,14 +29,10 @@ import Data.Data import Data.String+import GHC.Exts import GHC.TypeLits import Language.Haskell.TH--#if __GLASGOW_HASKELL__ >= 800 import GHC.OverloadedLabels-#else-import Data.Proxy-#endif -------------------------------------------------------------------------------- -- A labelled value@@ -61,12 +60,10 @@ -------------------------------------------------------------------------------- -- Labels -#if __GLASGOW_HASKELL__ >= 800 instance l ~ l' => IsLabel (l :: Symbol) (Proxy l') where fromLabel _ = Proxy {-# INLINE fromLabel #-}-#endif instance IsString (Q Exp) where fromString str = [|Proxy :: Proxy $(litT (return (StrTyLit str)))|]@@ -106,11 +103,67 @@ -- | A record can be narrowed or have its order changed by projecting -- into record type. class Project from to where- -- | Narrow number of or change order of fields in a record.+ -- | Narrow number of or change order of fields in a record:+ -- Example: @project (#foo := 1, #bar := 2) :: ("bar" := Int)@ project :: from -> to --------------------------------------------------------------------------------+-- Key-value reflection++-- | Reflection on labelled fields.+class Reflect (c :: * -> Constraint) r where+ -- | Produce a list of field names, and each field applied to the+ -- given function. Example: @reflect \@Show show (#bar := "hello", #foo := 3)@+ reflect :: forall b. (forall a. c a => a -> b) -> r -> [(String, b)]++--------------------------------------------------------------------------------+-- Field reflection++-- | A constraint and a method which both simply ignore their+-- argument.+class Ignore a where ignore :: a -> ()+instance Ignore a where ignore _ = ()++-- | List the field labels present in the record. Example: @labels+-- (#bar := "hello", #foo := 3, #mu := "hi")@+labels :: Reflect Ignore r => r -> [String]+labels r = map fst (reflect @Ignore ignore r)++-------------------------------------------------------------------------------- -- TH-derived instances++-- Generate Reflect instances.+$(let labelt i = varT (mkName ("l" ++ show i))+ labelp i = varP (mkName ("l" ++ show i))+ labelv i = varE (mkName ("l" ++ show i))+ valuet i = varT (mkName ("v" ++ show i))+ valuev i = varE (mkName ("v" ++ show i))+ valuep i = varP (mkName ("v" ++ show i))+ c = varT (mkName "c")+ fp = varP (mkName "f")+ fv = varE (mkName "f")+ in sequence+ [ instanceD+ (sequence [[t|$(c) $(valuet i)|] | i <- [1 :: Int .. n]])+ [t|Reflect $(c) $(foldl+ appT+ (tupleT n)+ [[t|$(labelt i) := $(valuet i)|] | i <- [1 .. n]])|]+ [ funD+ 'reflect+ [ clause+ [fp, tupP [conP '(:=) [labelp i,valuep i] | i <- [1 .. n]]]+ (normalB+ (listE+ [ [|(symbolVal $(labelv i), $(fv) $(valuev i))|]+ | i <- [1 .. n]+ ]))+ []+ ]+ , return (PragmaD (InlineP 'reflect Inline FunLike AllPhases))+ ]+ | n <- [1 .. 24]+ ]) -- Generate Cons instances. $(let makeInstance size =