packages feed

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 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 =