From 8009e9f296ac81c2ac12563d27b1dd0b56936391 Mon Sep 17 00:00:00 2001 From: nicolas rolland Date: Fri, 30 Nov 2018 12:06:50 +0100 Subject: [PATCH 1/3] upgrade stackage 2018-11-30 and other lts --- package.yaml | 4 ++-- src/Bookkeeper/Internal.hs | 5 ++++- stack.yaml | 5 ++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/package.yaml b/package.yaml index 6ff413c..7e20bba 100644 --- a/package.yaml +++ b/package.yaml @@ -19,7 +19,7 @@ extra-source-files: ghc-options: -Wall dependencies: - - base >= 4.9 && < 4.11 + - base >= 4.9 && < 4.13 - type-level-sets - data-default-class @@ -89,6 +89,6 @@ executables: default-extensions: [] other-modules: [] dependencies: - - base >=4.9 && < 4.11 + - base >=4.9 && < 4.13 - bookkeeper - markdown-unlit diff --git a/src/Bookkeeper/Internal.hs b/src/Bookkeeper/Internal.hs index f5ef8cb..46231c9 100644 --- a/src/Bookkeeper/Internal.hs +++ b/src/Bookkeeper/Internal.hs @@ -49,6 +49,9 @@ instance Eq (Book' '[]) where instance (Eq val, Eq (Book' xs)) => Eq (Book' ((field :=> val) ': xs) ) where Book (Map.Ext _ a as) == Book (Map.Ext _ b bs) = a == b && Book as == Book bs +#if MIN_VERSION_base(4,11,0) +instance Semigroup (Book' '[]) where (<>) = mappend +#endif instance Monoid (Book' '[]) where mempty = emptyBook _ `mappend` _ = emptyBook @@ -236,7 +239,7 @@ instance fromGeneric (l :*: r) = Book $ Map.union (getBook (fromGeneric l)) (getBook (fromGeneric r)) -type family Expected a where +type family Expected (a :: k -> Type) :: k where Expected (l :+: r) = TypeError ('Text "Cannot convert sum types into Books") Expected U1 = TypeError ('Text "Cannot convert non-record types into Books") diff --git a/stack.yaml b/stack.yaml index 13b4ae2..9ee2c69 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,7 @@ -resolver: nightly-2017-08-24 +#resolver: lts-9.21 does not work with this lts +#resolver: lts-12.20 +#resolver: lts-11.22 +resolver: nightly-2018-11-29 packages: - '.' extra-deps: From 4cc7cdd5a3a09891ebb24dea1a7d61cd3aaa641f Mon Sep 17 00:00:00 2001 From: nicolas rolland Date: Fri, 30 Nov 2018 14:12:34 +0100 Subject: [PATCH 2/3] update version to 0.2.6 --- package.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.yaml b/package.yaml index 7e20bba..f7f989d 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: bookkeeper -version: 0.2.5 +version: 0.2.6 synopsis: Anonymous records and overloaded labels description: Please see README.md for more information and examples. homepage: http://github.com/turingjump/bookkeeper#readme From 96d8f42e1c0fbac2f269de2a418668803bfdc491 Mon Sep 17 00:00:00 2001 From: nicolas rolland Date: Wed, 3 Sep 2025 15:05:04 +0200 Subject: [PATCH 3/3] upgrade to lts-24.8 --- bookkeeper.cabal | 125 ++++++++++++++++++++---- package.yaml | 4 +- src/Bookkeeper.hs | 96 ++++++++++--------- src/Bookkeeper/Internal.hs | 188 ++++++++++++++++++++++++------------- stack.yaml | 12 ++- 5 files changed, 292 insertions(+), 133 deletions(-) diff --git a/bookkeeper.cabal b/bookkeeper.cabal index f34c2d4..3f70ab5 100644 --- a/bookkeeper.cabal +++ b/bookkeeper.cabal @@ -1,11 +1,13 @@ --- This file has been generated from package.yaml by hpack version 0.20.0. +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack -- --- hash: 919c9bd63ad7efe1c1c555270f3970af8bead66e26cb198aca395daf0d1abc13 +-- hash: ecef739b4b4c0da0f5492732943ec779bf3f3c16e66e4ac1248d97f94126313a name: bookkeeper -version: 0.2.5 +version: 0.2.6 synopsis: Anonymous records and overloaded labels description: Please see README.md for more information and examples. category: Data Structures, Records @@ -16,14 +18,13 @@ maintainer: jkarni@gmail.com copyright: (c) Julian K. Arni license: BSD3 license-file: LICENSE -tested-with: GHC == 8.0.1, GHC == 8.2.1 +tested-with: + GHC == 8.0.1, GHC == 8.2.1 build-type: Simple -cabal-version: >= 1.10 - extra-source-files: CHANGELOG.md - package.yaml README.md + package.yaml source-repository head type: git @@ -32,10 +33,33 @@ source-repository head library hs-source-dirs: src - default-extensions: AutoDeriveTypeable ConstraintKinds DataKinds DefaultSignatures DeriveFunctor DeriveGeneric DeriveFoldable DeriveTraversable FlexibleContexts FlexibleInstances FunctionalDependencies GADTs MultiParamTypeClasses KindSignatures TypeInType OverloadedStrings RankNTypes ScopedTypeVariables TypeApplications TypeFamilies TypeOperators OverloadedLabels MagicHash + default-extensions: + AutoDeriveTypeable + ConstraintKinds + DataKinds + DefaultSignatures + DeriveFunctor + DeriveGeneric + DeriveFoldable + DeriveTraversable + FlexibleContexts + FlexibleInstances + FunctionalDependencies + GADTs + MultiParamTypeClasses + KindSignatures + TypeInType + OverloadedStrings + RankNTypes + ScopedTypeVariables + TypeApplications + TypeFamilies + TypeOperators + OverloadedLabels + MagicHash ghc-options: -Wall build-depends: - base >=4.9 && <4.11 + base >=4.9 && <4.13 , data-default-class , type-level-sets exposed-modules: @@ -51,7 +75,7 @@ executable readme exec ghc-options: -Wall -pgmL markdown-unlit -fno-warn-unused-top-binds build-depends: - base >=4.9 && <4.11 + base >=4.9 && <4.13 , bookkeeper , data-default-class , markdown-unlit @@ -63,11 +87,34 @@ test-suite doctest main-is: Doctest.hs hs-source-dirs: doctest - default-extensions: AutoDeriveTypeable ConstraintKinds DataKinds DefaultSignatures DeriveFunctor DeriveGeneric DeriveFoldable DeriveTraversable FlexibleContexts FlexibleInstances FunctionalDependencies GADTs MultiParamTypeClasses KindSignatures TypeInType OverloadedStrings RankNTypes ScopedTypeVariables TypeApplications TypeFamilies TypeOperators OverloadedLabels MagicHash + default-extensions: + AutoDeriveTypeable + ConstraintKinds + DataKinds + DefaultSignatures + DeriveFunctor + DeriveGeneric + DeriveFoldable + DeriveTraversable + FlexibleContexts + FlexibleInstances + FunctionalDependencies + GADTs + MultiParamTypeClasses + KindSignatures + TypeInType + OverloadedStrings + RankNTypes + ScopedTypeVariables + TypeApplications + TypeFamilies + TypeOperators + OverloadedLabels + MagicHash ghc-options: -Wall build-depends: Glob >=0.7 && <0.9 - , base >=4.9 && <4.11 + , base >=4.9 && <4.13 , data-default-class , doctest >=0.9 && <0.12 , type-level-sets @@ -81,11 +128,34 @@ test-suite spec main-is: Spec.hs hs-source-dirs: test - default-extensions: AutoDeriveTypeable ConstraintKinds DataKinds DefaultSignatures DeriveFunctor DeriveGeneric DeriveFoldable DeriveTraversable FlexibleContexts FlexibleInstances FunctionalDependencies GADTs MultiParamTypeClasses KindSignatures TypeInType OverloadedStrings RankNTypes ScopedTypeVariables TypeApplications TypeFamilies TypeOperators OverloadedLabels MagicHash + default-extensions: + AutoDeriveTypeable + ConstraintKinds + DataKinds + DefaultSignatures + DeriveFunctor + DeriveGeneric + DeriveFoldable + DeriveTraversable + FlexibleContexts + FlexibleInstances + FunctionalDependencies + GADTs + MultiParamTypeClasses + KindSignatures + TypeInType + OverloadedStrings + RankNTypes + ScopedTypeVariables + TypeApplications + TypeFamilies + TypeOperators + OverloadedLabels + MagicHash ghc-options: -Wall build-depends: QuickCheck >=2.8 && <2.11 - , base >=4.9 && <4.11 + , base >=4.9 && <4.13 , bookkeeper , data-default-class , hspec >2 && <3 @@ -100,10 +170,33 @@ benchmark bench main-is: Main.hs hs-source-dirs: bench - default-extensions: AutoDeriveTypeable ConstraintKinds DataKinds DefaultSignatures DeriveFunctor DeriveGeneric DeriveFoldable DeriveTraversable FlexibleContexts FlexibleInstances FunctionalDependencies GADTs MultiParamTypeClasses KindSignatures TypeInType OverloadedStrings RankNTypes ScopedTypeVariables TypeApplications TypeFamilies TypeOperators OverloadedLabels MagicHash + default-extensions: + AutoDeriveTypeable + ConstraintKinds + DataKinds + DefaultSignatures + DeriveFunctor + DeriveGeneric + DeriveFoldable + DeriveTraversable + FlexibleContexts + FlexibleInstances + FunctionalDependencies + GADTs + MultiParamTypeClasses + KindSignatures + TypeInType + OverloadedStrings + RankNTypes + ScopedTypeVariables + TypeApplications + TypeFamilies + TypeOperators + OverloadedLabels + MagicHash ghc-options: -Wall -Wall build-depends: - base >=4.9 && <4.11 + base >=4.9 && <4.13 , bookkeeper , criterion , data-default-class diff --git a/package.yaml b/package.yaml index f7f989d..7148434 100644 --- a/package.yaml +++ b/package.yaml @@ -19,7 +19,7 @@ extra-source-files: ghc-options: -Wall dependencies: - - base >= 4.9 && < 4.13 + - base >= 4.9 && < 4.21 - type-level-sets - data-default-class @@ -89,6 +89,6 @@ executables: default-extensions: [] other-modules: [] dependencies: - - base >=4.9 && < 4.13 + - base >=4.9 && < 4.21 - bookkeeper - markdown-unlit diff --git a/src/Bookkeeper.hs b/src/Bookkeeper.hs index 7476583..d28d4eb 100644 --- a/src/Bookkeeper.hs +++ b/src/Bookkeeper.hs @@ -1,50 +1,54 @@ module Bookkeeper - ( - -- * Preamble --- | The examples here presume the following setup: --- --- >>> import Data.Char (toUpper) --- >>> type Person = Book '[ "name" :=> String , "age" :=> Int ] --- >>> let julian :: Person = emptyBook & #age =: 28 & #name =: "Julian K. Arni" --- --- The OverloadedLabels and TypeOperators extensions are also required. --- --- A word of warning: The signatures for most of the functions are quite --- arcane, even though their behaviour is intuitive. - - -- * Initialization - emptyBook - - -- * Getters - , Gettable - , (?:) - , get - - -- * Setters - , Settable - , set - , (=:) - - -- * Modifying - , Modifiable - , modify - , (%:) - - -- * Deleting - , delete - - -- * Types - , Book - , (:=>) - , Key - - -- * From Haskell record - , fromRecord - - -- * Re-exports - , (&) - - ) where + ( -- * Preamble + + -- | The examples here presume the following setup: + -- + -- >>> import Data.Char (toUpper) + -- >>> type Person = Book '[ "name" :=> String , "age" :=> Int ] + -- >>> let julian :: Person = emptyBook & #age =: 28 & #name =: "Julian K. Arni" + -- + -- The OverloadedLabels and TypeOperators extensions are also required. + -- + -- A word of warning: The signatures for most of the functions are quite + -- arcane, even though their behaviour is intuitive. + + -- * Initialization + emptyBook, + + -- * Getters + Gettable, + (?:), + get, + + -- * Setters + Settable, + set, + (=:), + + -- * Modifying + Modifiable, + modify, + (%:), + + -- * Deleting + delete, + + -- * Types + Book, + (:=>), + Key, + + -- * From Haskell record + fromRecord, + + -- * Value level + toValue, + hasEntries, + + -- * Re-exports + (&), + ) +where import Bookkeeper.Internal import Data.Function diff --git a/src/Bookkeeper/Internal.hs b/src/Bookkeeper/Internal.hs index 46231c9..4635f10 100644 --- a/src/Bookkeeper/Internal.hs +++ b/src/Bookkeeper/Internal.hs @@ -1,19 +1,21 @@ -{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE CPP #-} +{-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-redundant-constraints #-} + module Bookkeeper.Internal where -import GHC.OverloadedLabels -import GHC.Generics -import qualified Data.Type.Map as Map -import GHC.TypeLits (Symbol, KnownSymbol, TypeError, ErrorMessage(..)) -import Data.Default.Class (Default(..)) +import Bookkeeper.Internal.Errors +import Data.Default.Class (Default (..)) +import Data.Dynamic +import Data.Typeable (Proxy(..),TypeRep,typeRep) import Data.Kind (Type) -import Data.Type.Map (Map, Mapping((:->))) -import Data.Monoid ((<>)) import Data.List (intercalate) - -import Bookkeeper.Internal.Errors +import Data.Monoid ((<>)) +import Data.Type.Map (Map, Mapping ((:->))) +import qualified Data.Type.Map as Map +import GHC.Generics +import GHC.OverloadedLabels +import GHC.TypeLits (ErrorMessage (..), KnownSymbol, Symbol, symbolVal, TypeError) ------------------------------------------------------------------------------ -- Book @@ -24,9 +26,9 @@ import Bookkeeper.Internal.Errors type Book a = Book' (Map.AsMap a) -- | The internal representation of a Book. -newtype Book' (a :: [Mapping Symbol Type]) = Book { getBook :: Map a } +newtype Book' (a :: [Mapping Symbol Type]) = Book {getBook :: Map a} -instance ShowHelper (Book' a) => Show (Book' a) where +instance (ShowHelper (Book' a)) => Show (Book' a) where show x = "Book {" <> intercalate ", " (go <$> showHelper x) <> "}" where go (k, v) = k <> " = " <> v @@ -37,16 +39,19 @@ class ShowHelper a where instance ShowHelper (Book' '[]) where showHelper _ = [] -instance ( ShowHelper (Book' xs) - , KnownSymbol k - , Show v - ) => ShowHelper (Book' ((k :=> v) ': xs)) where - showHelper (Book (Map.Ext k v rest)) = (show k, show v):showHelper (Book rest) +instance + ( ShowHelper (Book' xs), + KnownSymbol k, + Show v + ) => + ShowHelper (Book' ((k :=> v) ': xs)) + where + showHelper (Book (Map.Ext k v rest)) = (show k, show v) : showHelper (Book rest) instance Eq (Book' '[]) where _ == _ = True -instance (Eq val, Eq (Book' xs)) => Eq (Book' ((field :=> val) ': xs) ) where +instance (Eq val, Eq (Book' xs)) => Eq (Book' ((field :=> val) ': xs)) where Book (Map.Ext _ a as) == Book (Map.Ext _ b bs) = a == b && Book as == Book bs #if MIN_VERSION_base(4,11,0) @@ -59,9 +64,12 @@ instance Monoid (Book' '[]) where instance Default (Book' '[]) where def = emptyBook -instance ( Default (Book' xs) - , Default v - ) => Default (Book' ((k :=> v) ': xs)) where +instance + ( Default (Book' xs), + Default v + ) => + Default (Book' ((k :=> v) ': xs)) + where def = Book (Map.Ext Map.Var def (getBook def)) -- | A book with no records. You'll usually want to use this to construct @@ -69,6 +77,40 @@ instance ( Default (Book' xs) emptyBook :: Book '[] emptyBook = Book Map.Empty +-- idealement traversable +-- mais besoin de type in type ? + +class ToValue a where + toValue :: a -> [(String, Dynamic)] + +instance ToValue (Book' '[]) where + toValue _ = [] + +instance + ( ToValue (Book' xs), + KnownSymbol k, + Typeable v + ) => + ToValue (Book' ((k :=> v) ': xs)) + where + toValue (Book (Map.Ext k v rest)) = (show k, toDyn v) : toValue (Book rest) + +-- idealement un dag representant l'ensemble des chemins +class HasEntries t where + hasEntries :: Proxy t -> [(String, TypeRep)] + +instance HasEntries (Book' '[]) where + hasEntries _ = [] + +instance + ( HasEntries (Book' xs), + KnownSymbol k, + Typeable v + ) => + HasEntries (Book' ((k :=> v) ': xs)) + where + hasEntries _ = (symbolVal (Key :: Key k), typeRep (Proxy :: Proxy v)) : hasEntries (Proxy :: Proxy (Book' xs)) + ------------------------------------------------------------------------------ -- Other types ------------------------------------------------------------------------------ @@ -77,7 +119,6 @@ emptyBook = Book Map.Empty -- constructors. type a :=> b = a ':-> b - instance (s ~ s') => IsLabel s (Key s') where #if MIN_VERSION_base(4,10,0) fromLabel = Key @@ -113,18 +154,23 @@ type Gettable field book val = (Map.Submap '[field :=> val] book, Contains book -- ... '["age" ':-> Int, "name" ':-> String] -- ... • In the expression: get #moneyFrom julian -- ... -get :: forall field book val. (Gettable field book val) - => Key field -> Book' book -> val +get :: + forall field book val. + (Gettable field book val) => + Key field -> Book' book -> val get _ (Book bk) = case (Map.submap bk :: Map '[field :=> val]) of - Map.Ext _ v Map.Empty -> v + Map.Ext _ v Map.Empty -> v -- | Flipped and infix version of 'get'. -- -- >>> julian ?: #name -- "Julian K. Arni" -(?:) :: forall field book val. (Gettable field book val) - => Book' book -> Key field -> val +(?:) :: + forall field book val. + (Gettable field book val) => + Book' book -> Key field -> val (?:) = flip get + infixl 3 ?: -- * Setters @@ -133,18 +179,19 @@ infixl 3 ?: -- 'field' to a value of type 'val' in the book of type 'Book old'. The -- resulting book will have type 'Book new'. type Settable field val old new = - ( - Map.Submap (Map.AsMap (old Map.:\ field)) old - , Map.Unionable '[ field :=> val] (Map.AsMap (old Map.:\ field)) - , new ~ Map.AsMap (( field :=> val) ': (Map.AsMap (old Map.:\ field))) + ( Map.Submap (Map.AsMap (old Map.:\ field)) old, + Map.Unionable '[field :=> val] (Map.AsMap (old Map.:\ field)), + new ~ Map.AsMap ((field :=> val) ': (Map.AsMap (old Map.:\ field))) ) -- | Sets or updates a field to a value. -- -- >>> set #likesDoctest True julian -- Book {age = 28, likesDoctest = True, name = "Julian K. Arni"} -set :: forall field val old new . ( Settable field val old new) - => Key field -> val -> Book' old -> Book' new +set :: + forall field val old new. + (Settable field val old new) => + Key field -> val -> Book' old -> Book' new set p v old = Book new where Book deleted = delete p old @@ -155,9 +202,11 @@ set p v old = Book new -- -- >>> julian & #age =: 29 -- Book {age = 29, name = "Julian K. Arni"} -(=:) :: ( Settable field val old new) - => Key field -> val -> Book' old -> Book' new +(=:) :: + (Settable field val old new) => + Key field -> val -> Book' old -> Book' new (=:) = set + infix 3 =: -- * Modifiers @@ -166,10 +215,10 @@ infix 3 =: -- function of type @val -> val'@ to the field @field@ in the book of type -- @Book old@. The resulting book will have type @Book new@. type Modifiable field val val' old new = - ( Settable field val' old new - , Map.AsMap new ~ new - , Contains old field val - , Map.Submap '[ field :=> val] old + ( Settable field val' old new, + Map.AsMap new ~ new, + Contains old field val, + Map.Submap '[field :=> val] old ) -- | Apply a function to a field. @@ -185,20 +234,23 @@ type Modifiable field val val' old new = -- ... '["age" ':-> Int, "name" ':-> String] -- ... • In the expression: modify #height (\ _ -> 132) julian -- ... -modify :: ( Modifiable field val val' old new) - => Key field -> (val -> val') -> Book' old -> Book new +modify :: + (Modifiable field val val' old new) => + Key field -> (val -> val') -> Book' old -> Book new modify p f b = set p v b - where v = f $ get p b + where + v = f $ get p b -- | Infix version of 'modify'. -- -- >>> julian & #name %: fmap toUpper -- Book {age = 28, name = "JULIAN K. ARNI"} -(%:) :: ( Modifiable field val val' old new) - => Key field -> (val -> val') -> Book' old -> Book new +(%:) :: + (Modifiable field val val' old new) => + Key field -> (val -> val') -> Book' old -> Book new (%:) = modify -infixr 3 %: +infixr 3 %: -- | Delete a field from a 'Book', if it exists. If it does not, returns the -- @Book@ unmodified. @@ -210,9 +262,10 @@ infixr 3 %: -- ... '["age" ':-> Int] -- ... • In the expression: get #name -- ... -delete :: forall field old . - ( Map.Submap (Map.AsMap (old Map.:\ field)) old - ) => Key field -> Book' old -> Book (old Map.:\ field) +delete :: + forall field old. + (Map.Submap (Map.AsMap (old Map.:\ field)) old) => + Key field -> Book' old -> Book (old Map.:\ field) delete _ (Book bk) = Book $ Map.submap bk -- * Generics @@ -220,38 +273,45 @@ delete _ (Book bk) = Book $ Map.submap bk class FromGeneric a book | a -> book where fromGeneric :: a x -> Book' book -instance FromGeneric cs book => FromGeneric (D1 m cs) book where +instance (FromGeneric cs book) => FromGeneric (D1 m cs) book where fromGeneric (M1 xs) = fromGeneric xs -instance FromGeneric cs book => FromGeneric (C1 m cs) book where +instance (FromGeneric cs book) => FromGeneric (C1 m cs) book where fromGeneric (M1 xs) = fromGeneric xs -instance (v ~ Map.AsMap ('[name ':-> t])) - => FromGeneric (S1 ('MetaSel ('Just name) p s l) (Rec0 t)) v where +instance + (v ~ Map.AsMap ('[name ':-> t])) => + FromGeneric (S1 ('MetaSel ('Just name) p s l) (Rec0 t)) v + where fromGeneric (M1 (K1 t)) = (Key =: t) emptyBook instance - ( FromGeneric l lbook - , FromGeneric r rbook - , Map.Unionable lbook rbook - , book ~ Map.Union lbook rbook - ) => FromGeneric (l :*: r) book where - fromGeneric (l :*: r) - = Book $ Map.union (getBook (fromGeneric l)) (getBook (fromGeneric r)) + ( FromGeneric l lbook, + FromGeneric r rbook, + Map.Unionable lbook rbook, + book ~ Map.Union lbook rbook + ) => + FromGeneric (l :*: r) book + where + fromGeneric (l :*: r) = + Book $ Map.union (getBook (fromGeneric l)) (getBook (fromGeneric r)) type family Expected (a :: k -> Type) :: k where Expected (l :+: r) = TypeError ('Text "Cannot convert sum types into Books") - Expected U1 = TypeError ('Text "Cannot convert non-record types into Books") + Expected U1 = TypeError ('Text "Cannot convert non-record types into Books") instance (book ~ Expected (l :+: r)) => FromGeneric (l :+: r) book where fromGeneric = error "impossible" -instance {-# OVERLAPPABLE #-} - (book ~ Expected lhs, lhs ~ U1 - ) => FromGeneric lhs book where +instance + {-# OVERLAPPABLE #-} + ( book ~ Expected lhs, + lhs ~ U1 + ) => + FromGeneric lhs book + where fromGeneric = error "impossible" - -- | Generate a @Book@ from an ordinary Haskell record via GHC Generics. -- -- >>> data Test = Test { field1 :: String, field2 :: Int, field3 :: Char } deriving Generic diff --git a/stack.yaml b/stack.yaml index 9ee2c69..70a64ac 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,9 +1,11 @@ -#resolver: lts-9.21 does not work with this lts -#resolver: lts-12.20 -#resolver: lts-11.22 -resolver: nightly-2018-11-29 +resolver: lts-24.8 +#resolver: nightly-2018-11-29 packages: - '.' + extra-deps: -- 'type-level-sets-0.8.0.0' +- git: https://github.com/dorchard/type-level-sets + commit: d71becf49c092cd7697f39e4f4fb55b289af3d31 +#- ../type-level-sets flags: {} +#allow-newer: true