packages feed

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 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