vinyl-utils 0.1.0.1 → 0.2.0.0
raw patch · 8 files changed
+166/−66 lines, 8 filesdep ~basedep ~contravariantdep ~transformers
Dependency ranges changed: base, contravariant, transformers, vinyl
Files
- README.md +2/−0
- changelog.md +6/−2
- src/Data/Vinyl/Utils/Compose.hs +11/−11
- src/Data/Vinyl/Utils/Const.hs +29/−23
- src/Data/Vinyl/Utils/Field.hs +44/−0
- src/Data/Vinyl/Utils/Operator.hs +12/−15
- src/Data/Vinyl/Utils/Proxy.hs +41/−0
- vinyl-utils.cabal +21/−15
+ README.md view
@@ -0,0 +1,2 @@+# vinyl-utils+Utilities for Vinyl
changelog.md view
@@ -1,6 +1,10 @@-0.1.0.1+0.2.0.0+------- -* Bumped base to 4.8+* Updated for base-4.8+* Added operations on field constraints.+* Added proxy record generation.+* Removed ConstApplicative type class, replaced by generation from proxy record. 0.1.0.0 -------
src/Data/Vinyl/Utils/Compose.hs view
@@ -1,3 +1,12 @@+{-|+Module : Data.Vinyl.Utils.Compose+Copyright : (c) Marcin Mrotek, 2014+License : BSD3+Maintainer : marcin.jan.mrotek@gmail.com++Operations on composed functor records.+-}+ {-# LANGUAGE DataKinds , PolyKinds@@ -5,18 +14,9 @@ {-# OPTIONS_HADDOCK show-extensions #-} -{-|-Module : Data.Vinyl.Utils.Compose-Description : Operations on records parametrized with composition of functors.-Copyright : (c) Marcin Mrotek, 2014-License : BSD3-Maintainer : marcin.jan.mrotek@gmail.com--}+module Data.Vinyl.Utils.Compose + ( rtraverse1 ) where -module Data.Vinyl.Utils.Compose (- rtraverse1-) where-import Control.Applicative import Data.Vinyl.Functor import Data.Vinyl
src/Data/Vinyl/Utils/Const.hs view
@@ -1,3 +1,13 @@+{-|+Module : Data.Vinyl.Utils.Const+Copyright : (c) Marcin Mrotek, 2014+License : BSD3+Maintainer : marcin.jan.mrotek@gmail.com++Operations on constant type records.+-}++ {-# LANGUAGE DataKinds , PolyKinds@@ -7,24 +17,19 @@ {-# OPTIONS_HADDOCK show-extensions #-} -{-|-Module : Data.Vinyl.Utils.Const-Description : Operations on constant type records.-Copyright : (c) Marcin Mrotek, 2014-License : BSD3-Maintainer : marcin.jan.mrotek@gmail.com--}--module Data.Vinyl.Utils.Const (- ConstApplicative(..)- , rconst- , constCommute- , rtraverseconst-) where+module Data.Vinyl.Utils.Const+ ( cfmap+ , cpure+ , capp+ , rconst+ , constCommute+ , rtraverseconst+ , Record (..)+ ) where import Data.Vinyl.Utils.Compose+import Data.Vinyl.Utils.Proxy -import Control.Applicative hiding (Const) import Data.Vinyl.Functor import Data.Vinyl @@ -33,20 +38,20 @@ cfmap _ RNil = RNil cfmap f (Const r :& rs) = Const (f r) :& cfmap f rs --- |Extension of 'pure' to constant type records.-class ConstApplicative (rs :: [k]) where- cpure :: a -> Rec (Const a) rs- -instance ConstApplicative '[] where- cpure = const RNil+cpure :: Record rs => a -> Rec (Const a) rs+-- ^Extension of 'pure' to constant type records.+cpure = cpure' proxyRecord -instance ConstApplicative rs => ConstApplicative (r ': rs) where- cpure x = Const x :& cpure x+cpure' :: Rec Proxy rs -> a -> Rec (Const a) rs+cpure' RNil _ = RNil+cpure' (Proxy :& ps) a = Const a :& cpure' ps a capp :: (Rec (Const (a -> b)) rs) -> Rec (Const a) rs -> Rec (Const b) rs -- ^Extension of (<*>) to constant type records. capp RNil RNil = RNil capp (Const f :& fs) (Const x :& xs) = Const (f x) :& capp fs xs+capp RNil _ = error "impossible"+capp _ RNil = error "impossible" rconst :: (Applicative f, RecApplicative rs) => f a -> f (Rec (Const a) rs) rconst = rtraverse1 . rcpure@@ -59,3 +64,4 @@ rtraverseconst :: Applicative f => Rec (Const (f a)) rs -> f (Rec (Const a) rs) -- ^Distribute a functor over a constant type record. rtraverseconst rec = rtraverse1 $ constCommute <<$>> rec+
+ src/Data/Vinyl/Utils/Field.hs view
@@ -0,0 +1,44 @@+{-|+Module : Data.Vinyl.Utils.Field+Copyright : (c) Marcin Mrotek, 2014+License : BSD3+Maintainer : marcin.jan.mrotek@gmail.com++Manipulation of constraints that apply to field labels (as opposed to actual types stored in the record).+-}++{-# LANGUAGE + ConstraintKinds+ , DataKinds+ , GADTs+ , PolyKinds+ , TypeFamilies+ , TypeOperators+ #-}++{-# OPTIONS_HADDOCK show-extensions #-}++module Data.Vinyl.Utils.Field where++import Data.Proxy+import Data.Vinyl+import GHC.Exts++-- |Assert that all field labels in a given type list satisfy a given constraint.+type family FieldAll (rs :: [k]) (c :: k -> Constraint) :: Constraint where+ FieldAll '[] c = ()+ FieldAll (r ': rs) c = (c r, FieldAll rs c)++-- |An empty data type that reifies a constraint.+data DictProxy c a where+ DictProxy :: c a => DictProxy c a++getProxy :: DictProxy c a -> Proxy a+-- ^Obtain a 'Proxy' from a 'DictProxy'+getProxy DictProxy = Proxy++reifyFieldConstraint :: FieldAll rs c => proxy c -> Rec Proxy rs -> Rec (DictProxy c) rs+-- ^Given a constraint that applies to all field labels and a dummy record, reify the constraint for all field labels.+reifyFieldConstraint _ RNil = RNil+reifyFieldConstraint c (Proxy :& ps) = DictProxy :& reifyFieldConstraint c ps+
src/Data/Vinyl/Utils/Operator.hs view
@@ -1,3 +1,12 @@+{-|+Module : Data.Vinyl.Utils.Operator+Copyright : (c) Marcin Mrotek, 2014+License : BSD3+Maintainer : marcin.jan.mrotek@gmail.com++Operations on records parametrized with various kinds of functions.+-}+ {-# LANGUAGE ConstraintKinds , DataKinds@@ -13,23 +22,12 @@ {-# OPTIONS_HADDOCK show-extensions #-} -{-|-Module : Data.Vinyl.Utils.Operator-Description : Operations on records parametrized with various kinds of functions.-Copyright : (c) Marcin Mrotek, 2014-License : BSD3-Maintainer : marcin.jan.mrotek@gmail.com--}- module Data.Vinyl.Utils.Operator ( operator , (/$/), (/$$/), (\$\), (\$$\), (\&&\), (\||\)- , p ) where -import Control.Applicative hiding (Const) import Data.Functor.Contravariant-import Data.Monoid import Data.Vinyl import Data.Vinyl.Functor @@ -37,6 +35,8 @@ -- ^Create an operator between records sharing their fields but differing in functors. operator _ RNil RNil = RNil operator f (a :& as) (b :& bs) = (f a b) :& operator f as bs+operator _ RNil _ = error "impossible"+operator _ _ RNil = error "impossible" (/$/) :: Functor f => Rec ((->) a) rs -> Rec (Const (f a)) rs -> Rec f rs -- ^Apply a record of (a -> x) functions to a constant type record to obtain a plain f-record.@@ -54,6 +54,7 @@ -- ^Apply a record of (f x -> a) functions to a plain f-record to obtain a constant type record. (\$$\) = operator (\(Compose (Op f)) x -> Const $ f x) +predicate :: Functor f => Predicate t -> f t -> Const (f Bool) a predicate (Predicate p) x = Const $ p <$> x (\&&\) :: forall f rs. Applicative f => Rec Predicate rs -> Rec f rs -> f Bool@@ -75,8 +76,4 @@ go (Const a :& as) b = go as $ (||) <$> a <*> b result :: Rec (Const (f Bool)) rs result = operator predicate p r--p :: (a -> Bool) -> Predicate a--- ^Shorthand for creation of predicates.-p = Predicate
+ src/Data/Vinyl/Utils/Proxy.hs view
@@ -0,0 +1,41 @@+{-|+Module : Data.Vinyl.Utils.Proxy+Copyright : (c) Marcin Mrotek, 2014+License : BSD3+Maintainer : marcin.jan.mrotek@gmail.com++Create a dummy record parametrized by 'Proxy', for the purpose of guiding code generation through pattern matching.+-}++{-# LANGUAGE+ DataKinds+ , GADTs+ , RankNTypes+ , TypeOperators+ #-}++module Data.Vinyl.Utils.Proxy + ( module Data.Vinyl.Utils.Proxy+ , Proxy (..)+ ) where++import Data.Proxy+import Data.Vinyl++-- |Create a dummy record parametrized by 'Proxy'. The class is named 'Record' to signify that every possible type list is its instance.+class Record rs where+ proxyRecord :: Rec Proxy rs++instance Record '[] where+ proxyRecord = RNil++instance Record rs => Record (r ': rs) where+ proxyRecord = Proxy :& proxyRecord++recPure :: Record rs => (forall a. f a) -> Rec f rs+recPure = recPure' proxyRecord++recPure' :: Rec Proxy rs -> (forall a. f a) -> Rec f rs+recPure' RNil _ = RNil+recPure' (Proxy :& ps) a = a :& recPure' ps a+
vinyl-utils.cabal view
@@ -1,34 +1,40 @@--- Initial vinyl-utils.cabal generated by cabal init. For further --- documentation, see http://haskell.org/cabal/users-guide/- name: vinyl-utils-version: 0.1.0.1+version: 0.2.0.0 synopsis: Utilities for vinyl description: Operations on records parametrized with various kinds of functors. license: BSD3 license-file: LICENSE author: Marcin Mrotek maintainer: marcin.jan.mrotek@gmail.com--- copyright: +copyright: (c) Marcin Mrotek 2015 category: Control build-type: Simple--- extra-source-files: +extra-source-files: README.md cabal-version: >=1.10-homepage: http://hub.darcs.net/mjm/vinyl-utils+homepage: https://github.com/marcinmrotek/vinyl-utils extra-source-files: changelog.md source-repository head- type: darcs- location: mjm@hub.darcs.net:mjm/vinyl-utils+ type: git+ location: https://github.com/marcinmrotek/vinyl-utils +Flag devel+ description: Development mode (-Werror).+ default: False+ manual: True+ library exposed-modules: Data.Vinyl.Utils.Const ,Data.Vinyl.Utils.Compose+ ,Data.Vinyl.Utils.Field ,Data.Vinyl.Utils.Operator- -- other-modules: - -- other-extensions: - build-depends: base >= 4.7 && < 4.9- ,contravariant- ,transformers- ,vinyl >= 0.5+ ,Data.Vinyl.Utils.Proxy+ build-depends: base >= 4.8 && < 4.9+ ,contravariant >= 1.3 && < 1.4+ ,transformers >= 0.4 && < 0.5+ ,vinyl >= 0.5 && < 0.6 hs-source-dirs: src default-language: Haskell2010+ ghc-options: -Wall + if flag(devel)+ ghc-options: -Werror+