universe-instances-extended 1.1 → 1.1.1
raw patch · 2 files changed
+77/−4 lines, 2 filesdep +containersdep +contravariantdep +semigroupsdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: containers, contravariant, semigroups
Dependency ranges changed: base
API changes (from Hackage documentation)
+ Data.Universe.Instances.Extended: instance (Data.Universe.Class.Finite a, Data.Universe.Class.Finite b, GHC.Classes.Ord b) => Data.Universe.Class.Finite (Data.Functor.Contravariant.Op a b)
+ Data.Universe.Instances.Extended: instance (Data.Universe.Class.Finite a, GHC.Classes.Ord a) => Data.Universe.Class.Finite (Data.Functor.Contravariant.Predicate a)
+ Data.Universe.Instances.Extended: instance (Data.Universe.Class.Finite a, GHC.Classes.Ord a) => Data.Universe.Class.Universe (Data.Functor.Contravariant.Predicate a)
+ Data.Universe.Instances.Extended: instance (Data.Universe.Class.Universe a, Data.Universe.Class.Finite b, GHC.Classes.Ord b) => Data.Universe.Class.Universe (Data.Functor.Contravariant.Op a b)
Files
src/Data/Universe/Instances/Extended.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE UndecidableInstances #-}@@ -7,13 +8,35 @@ ) where import Control.Comonad.Trans.Traced (TracedT (..))-import Data.Functor.Rep (Representable (..), Co(..))+import Data.Functor.Contravariant (Op (..), Predicate (..))+import Data.Functor.Rep (Representable (..), Co (..))+import Data.Map (Map)+import Data.Set (Set) import Data.Universe.Class (Universe (..), Finite (..)) import Data.Universe.Helpers (retag, Tagged, Natural) +import qualified Data.Map as M+import qualified Data.Set as S++#if MIN_VERSION_base(4,7,0)+import Data.Coerce (coerce)+#endif++-- $setup+--+-- >>> import Data.Int (Int8)+--+-- -- Show (a -> b) instance (in universe-reverse-instances, but cannot depend on it here).+-- >>> instance (Finite a, Show a, Show b) => Show (a -> b) where showsPrec n f = showsPrec n [(a, f a) | a <- universeF]+--+-- >>> :set -XStandaloneDeriving+-- >>> deriving instance (Finite a, Show a) => Show (Predicate a)+ -- | We could do this: --+-- @ -- instance Universe (f a) => Universe (Co f a) where universe = map Rep universe+-- @ -- -- However, since you probably only apply Rep to functors when you want to -- think of them as being representable, I think it makes sense to use an@@ -29,9 +52,47 @@ => Universe (TracedT s f a) where universe = map tabulate universe +instance (Universe a, Finite b, Ord b) => Universe (Op a b) where+#if MIN_VERSION_base(4,7,0)+ universe = coerce (universe :: [b -> a])+#else+ universe = map Op universe+#endif+instance (Finite a, Ord a) => Universe (Predicate a) where+ universe = map (Predicate . flip S.member) universe+ instance (Representable f, Finite (Rep f), Ord (Rep f), Finite a) => Finite (Co f a) where universeF = map tabulate universeF; cardinality = retag (cardinality :: Tagged (Rep (Co f) -> a) Natural) instance (Representable f, Finite s, Ord s, Finite (Rep f), Ord (Rep f), Finite a) => Finite (TracedT s f a) where universeF = map tabulate universeF; cardinality = retag (cardinality :: Tagged (Rep (TracedT s f)) Natural)++instance (Finite a, Finite b, Ord b) => Finite (Op a b) where+ cardinality = retag (cardinality :: Tagged (b -> a) Natural)++-- |+--+-- >>> mapM_ print (universe :: [Predicate Ordering])+-- Predicate {getPredicate = [(LT,False),(EQ,False),(GT,False)]}+-- Predicate {getPredicate = [(LT,True),(EQ,False),(GT,False)]}+-- Predicate {getPredicate = [(LT,False),(EQ,True),(GT,False)]}+-- Predicate {getPredicate = [(LT,True),(EQ,True),(GT,False)]}+-- Predicate {getPredicate = [(LT,False),(EQ,False),(GT,True)]}+-- Predicate {getPredicate = [(LT,True),(EQ,False),(GT,True)]}+-- Predicate {getPredicate = [(LT,False),(EQ,True),(GT,True)]}+-- Predicate {getPredicate = [(LT,True),(EQ,True),(GT,True)]}+--+-- Beware, function type universes are large...+--+-- >>> cardinality :: Tagged (Predicate Int8) Natural+-- Tagged 115792089237316195423570985008687907853269984665640564039457584007913129639936+--+-- ... but thanks to laziness, you can expect at least few:+--+-- >>> let Predicate f : _ = universe :: [Predicate Int8]+-- >>> f 0+-- False+--+instance (Finite a, Ord a) => Finite (Predicate a) where+ cardinality = retag (cardinality :: Tagged (Set a) Natural)
universe-instances-extended.cabal view
@@ -1,5 +1,5 @@ name: universe-instances-extended-version: 1.1+version: 1.1.1 synopsis: Universe instances for types from selected extra packages description: A class for finite and recursively enumerable types and some helper functions for enumerating them@@ -37,6 +37,18 @@ exposed-modules: Data.Universe.Instances.Extended build-depends: adjunctions >=4.3 && <4.5- , base >=4.3 && <4.13 , comonad >=4.2 && <5.1- , universe-base >=1.1 && <1.1.1+ , containers+ , universe-base >=1.1 && <1.1.2++ if impl(ghc >=8.6.1)+ build-depends: base >=4.12 && <4.14++ if impl(ghc <8.0.1)+ build-depends: base >=4.3 && <4.14+ , contravariant+ , semigroups++ if impl(ghc >=8.0.1)+ build-depends: base >=4.9 && <4.14+ , contravariant