type-ord (empty) → 0.1
raw patch · 5 files changed
+108/−0 lines, 5 filesdep +basedep +template-haskelldep +type-booleanssetup-changed
Dependencies added: base, template-haskell, type-booleans, type-digits, type-spine
Files
- LICENSE +1/−0
- Setup.hs +2/−0
- Type/Ord.hs +39/−0
- Type/Ord/Base.hs +41/−0
- type-ord.cabal +25/−0
+ LICENSE view
@@ -0,0 +1,1 @@+BSD3
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Type/Ord.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE EmptyDataDecls, QuasiQuotes, TypeFamilies, UndecidableInstances,+ TemplateHaskell #-}++{- |++Module : Type.Ord+Copyright : (c) The University of Kansas 2011+License : BSD3++Maintainer : nicolas.frisby@gmail.com+Stability : experimental+Portability : see LANGUAGE pragmas (... GHC)++Type-level comparison operator, its result \"kind\", and that kind's case+expression. Plus instances for @()@-terminated @type-digits@ numerals.++-}+module Type.Ord (module Type.Ord.Base) where++import Type.Digits (digit, radix)++import Type.Ord.Base++import Language.Haskell.TH++++type instance Compare () () = EQ+fmap concat $ sequence [ do+ let dL = conT $ digit n+ [l, r] = map (varT . mkName) ["l", "r"]+ f x y z = tySynInstD ''Compare [x, y] z+ d <- f [t| $dL $l |] [t| $dL $r |] [t| Compare $l $r |]+ ((d:) . concat) `fmap` sequence [+ let dR = conT $ digit m in+ sequence [f [t| $dL $l |] [t| $dR $r |] [t| LT |],+ f [t| $dR $l |] [t| $dL $r |] [t| GT |]]+ | m <- [n + 1..radix - 1] ]+ | n <- [0..radix - 1] ]
+ Type/Ord/Base.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE TypeFamilies, EmptyDataDecls #-}++{- |++Module : Type.Ord.Base+Copyright : (c) The University of Kansas 2011+License : BSD3++Maintainer : nicolas.frisby@gmail.com+Stability : experimental+Portability : see LANGUAGE pragmas (... GHC)++Type-level comparison operator, its result \"kind\", and that kind's case+expression.++-}+module Type.Ord.Base+ (module Type.Booleans, Compare, LT, EQ, GT, OrdCase, IsEQ, IsLT, IsGT) where++import Type.Booleans (True, False)++++-- | Type-level comparison.+type family Compare l r++data LT; data EQ; data GT++-- | @OrdCase x a b c@ reduces to @a@, @b@, or @c@, if @x@ is @LT@, @EQ@, or+-- @GT@, respectively.+type OrdCase x a b c = OrdCase_ x a b c+type family OrdCase_ x a b c+type instance OrdCase_ LT a b c = a+type instance OrdCase_ EQ a b c = b+type instance OrdCase_ GT a b c = c++++type IsEQ t = OrdCase t False True False+type IsLT t = OrdCase t True False False+type IsGT t = OrdCase t False False True
+ type-ord.cabal view
@@ -0,0 +1,25 @@+Name: type-ord+Version: 0.1+License: BSD3+License-File: LICENSE+Author: Nicolas Frisby <nicolas.frisby@gmail.com>+Maintainer: Nicolas Frisby <nicolas.frisby@gmail.com>++Category: Type System++Synopsis: Type-level comparison operator++Description: Type-level comparison operator with instances for ()-terminated+ @type-digit@ numerals until <http://hackage.haskell.org/trac/ghc/ticket/1894>+ is resolved.++Cabal-Version: >= 1.6.0.1++Build-Type: Simple+++Library+ Build-Depends: base >= 4 && < 5, template-haskell+ Build-Depends: type-booleans < 0.2, type-spine < 0.2, type-digits < 0.2++ Exposed-Modules: Type.Ord, Type.Ord.Base