packages feed

haskus-utils-types 1.2 → 1.3

raw patch · 2 files changed

+62/−56 lines, 2 files

Files

haskus-utils-types.cabal view
@@ -1,29 +1,35 @@-cabal-version: >=1.20-name: haskus-utils-types-version: 1.2-license: BSD3-license-file: LICENSE-copyright: Sylvain Henry 2018-maintainer: sylvain@haskus.fr-author: Sylvain Henry-homepage: http://www.haskus.org-synopsis: Haskus utility modules+name:                haskus-utils-types+version:             1.3+synopsis:            Haskus utility modules+license:             BSD3+license-file:        LICENSE+author:              Sylvain Henry+maintainer:          sylvain@haskus.fr+homepage:            http://www.haskus.org+copyright:           Sylvain Henry 2018+category:            System+build-type:          Simple+cabal-version:       1.20+ description:-    Haskus types utility modules-category: System-build-type: Simple+   Haskus types utility modules  source-repository head-    type: git-    location: git://github.com/haskus/haskus-utils.git+  type: git+  location: git://github.com/haskus/haskus-utils.git  library-    exposed-modules:-        Haskus.Utils.Types-        Haskus.Utils.Types.List-        Haskus.Utils.Types.Generics-    hs-source-dirs: src/lib-    default-language: Haskell2010-    ghc-options: -Wall-    build-depends:-        base >=4.9 && <4.12+  exposed-modules:+    Haskus.Utils.Types+    Haskus.Utils.Types.List+    Haskus.Utils.Types.Generics++  other-modules:++  build-depends:       +         base                      >= 4.9 && < 5++  build-tools: +  ghc-options:          -Wall+  default-language:     Haskell2010+  hs-source-dirs:       src/lib
src/lib/Haskus/Utils/Types/List.hs view
@@ -36,13 +36,13 @@    , ReplaceN    , ReplaceNS    -- * Set operations-   , IsMember-   , IsSubset+   , CheckMember+   , CheckMembers    , Union    , Complement    , Product    , Member-   , Member'+   , Members    , CheckNub    -- * Index operations    , IndexOf@@ -62,6 +62,7 @@ where  import Haskus.Utils.Types+import GHC.Exts (Constraint)  -- | Map a type function type family Map (f :: a -> k) (xs :: [a]) :: [k] where@@ -184,33 +185,34 @@    Generate n m = n ': Generate (n+1) m  -- | Check that a type is member of a type list-type family IsMember (a :: k) (l :: [k]) :: Bool where-   IsMember a l = IsMember' l a l+type family CheckMember (a :: k) (l :: [k]) :: Constraint where+   CheckMember a l = CheckMember' l a l --- | Helper for IsMember-type family IsMember' (i :: [k]) (a :: k) (l :: [k]) :: Bool where-   IsMember' i a (a ': l) = 'True-   IsMember' i a (b ': l) = IsMember' i a l-   IsMember' i a '[]      = TypeError ( 'Text "`"-                                   ':<>: 'ShowType a-                                   ':<>: 'Text "'"-                                   ':<>: 'Text " is not a member of "-                                   ':<>: 'ShowType i)+-- | Helper for CheckMember+type family CheckMember' (i :: [k]) (a :: k) (l :: [k]) :: Constraint where+   CheckMember' i a (a ': l) = ()+   CheckMember' i a (b ': l) = CheckMember' i a l+   CheckMember' i a '[]      = TypeError ( 'Text "`"+                                     ':<>: 'ShowType a+                                     ':<>: 'Text "'"+                                     ':<>: 'Text " is not a member of "+                                     ':<>: 'ShowType i)   -- | Check that a list is a subset of another-type family IsSubset (l1 :: [k]) (l2 :: [k]) :: Bool where-   IsSubset l1 l1 = 'True-   IsSubset l1 l2 = IsSubset' l2 l1 l2+type family CheckMembers (l1 :: [k]) (l2 :: [k]) :: Constraint where+   CheckMembers l1 l1 = ()+   CheckMembers l1 l2 = CheckMembers' l2 '[] l1 l2 --- | Helper for IsSubset-type family IsSubset' (i :: [k]) (l1 :: [k]) (l2 :: [k]) :: Bool where-   IsSubset' i '[] l2 = 'True-   IsSubset' i l1 '[] = TypeError (     'ShowType l1-                                   ':$$: 'Text "is not a subset of"-                                   ':$$: 'ShowType i)-   IsSubset' i (x ': xs) (x ': ys) = IsSubset' i xs i-   IsSubset' i (x ': xs) (y ': ys) = IsSubset' i (x ': xs) ys+-- | Helper for CheckMembers+type family CheckMembers' (i :: [k]) (e :: [k]) (l1 :: [k]) (l2 :: [k]) :: Constraint where+   CheckMembers' i e '[] l2  = ()+   CheckMembers' i e '[] '[] = TypeError (   'ShowType e+                                       ':$$: 'Text "is not a subset of"+                                       ':$$: 'ShowType i)+   CheckMembers' i e (l ': ls) '[]       = CheckMembers' i (l ': e) ls i+   CheckMembers' i e (x ': xs) (x ': ys) = CheckMembers' i e xs i+   CheckMembers' i e (x ': xs) (y ': ys) = CheckMembers' i e (x ': xs) ys  -- | Get list indexes type family Indexes (l :: [k]) :: [Nat] where@@ -310,16 +312,14 @@  -- | Constraint: x member of xs type Member x xs =-   ( IsMember x xs ~ 'True-   , x ~ Index (IndexOf x xs) xs-   , KnownNat (IndexOf x xs)-   )---- | Constraint: x member of xs (silent)-type Member' x xs =    ( x ~ Index (IndexOf x xs) xs    , KnownNat (IndexOf x xs)    )++-- | Constraint: all the xs are members of ys+type family Members xs ys :: Constraint where+   Members '[] ys       = ()+   Members (x ': xs) ys = (Member x ys, Members xs ys)  -- | Check that a list only contain a value of each type type CheckNub (l :: [k]) =