lude

Haskell prelude alternative
git clone git://git.rr3.xyz/lude | git clone gits://git.rr3.xyz/lude
Log | Files | Refs | README | LICENSE

Tuple.hs (5454B)


      1 module Lude.Haskell.Tuple (
      2     Tuple0#,
      3     Tuple1#,
      4     Tuple2#,
      5     Tuple3#,
      6     Tuple4#,
      7     Tuple5#,
      8     Tuple6#,
      9     Tuple7#,
     10     Tuple8#,
     11     Tuple9#,
     12     Tuple0,
     13     MkTuple0,
     14     pattern MkTuple0,
     15     Tuple1,
     16     MkTuple1,
     17     pattern MkTuple1,
     18     Tuple2,
     19     MkTuple2,
     20     pattern MkTuple2,
     21     Tuple3,
     22     MkTuple3,
     23     pattern MkTuple3,
     24     Tuple4,
     25     MkTuple4,
     26     pattern MkTuple4,
     27     Tuple5,
     28     MkTuple5,
     29     pattern MkTuple5,
     30     Tuple6,
     31     MkTuple6,
     32     pattern MkTuple6,
     33     Tuple7,
     34     MkTuple7,
     35     pattern MkTuple7,
     36     Tuple8,
     37     MkTuple8,
     38     pattern MkTuple8,
     39     Tuple9,
     40     MkTuple9,
     41     pattern MkTuple9,
     42     Tuple#,
     43     Tuple,
     44 ) where
     45 
     46 import Data.Tuple.Experimental (
     47     Tuple0,
     48     Tuple0#,
     49     Tuple1,
     50     Tuple1#,
     51     Tuple2,
     52     Tuple2#,
     53     Tuple3,
     54     Tuple3#,
     55     Tuple4,
     56     Tuple4#,
     57     Tuple5,
     58     Tuple5#,
     59     Tuple6,
     60     Tuple6#,
     61     Tuple7,
     62     Tuple7#,
     63     Tuple8,
     64     Tuple8#,
     65     Tuple9,
     66     Tuple9#,
     67  )
     68 
     69 import Data.Tuple.Experimental qualified as GHC
     70 
     71 import Lude.Haskell.Core
     72 import Lude.Haskell.Repr qualified as Repr
     73 import Lude.Haskell.Type
     74 
     75 -- TODO: Rename so that we don't have # in names?
     76 
     77 --------------------------------------------------------------------------------
     78 
     79 type MkTuple0 :: Tuple0
     80 type MkTuple0 = ()
     81 pattern MkTuple0 :: Tuple0
     82 pattern MkTuple0 = ()
     83 {-# COMPLETE MkTuple0 #-}
     84 
     85 type MkTuple1 :: a -> Tuple1 a
     86 type MkTuple1 = GHC.MkSolo
     87 pattern MkTuple1 :: a -> Tuple1 a
     88 pattern MkTuple1 a = GHC.MkSolo a
     89 {-# COMPLETE MkTuple1 #-}
     90 
     91 type MkTuple2 :: a -> b -> Tuple2 a b
     92 type MkTuple2 = (,)
     93 pattern MkTuple2 :: a -> b -> Tuple2 a b
     94 pattern MkTuple2 a b = (a, b)
     95 {-# COMPLETE MkTuple2 #-}
     96 
     97 type MkTuple3 :: a -> b -> c -> Tuple3 a b c
     98 type MkTuple3 = (,,)
     99 pattern MkTuple3 :: a -> b -> c -> Tuple3 a b c
    100 pattern MkTuple3 a b c = (a, b, c)
    101 {-# COMPLETE MkTuple3 #-}
    102 
    103 type MkTuple4 :: a -> b -> c -> d -> Tuple4 a b c d
    104 type MkTuple4 = (,,,)
    105 pattern MkTuple4 :: a -> b -> c -> d -> Tuple4 a b c d
    106 pattern MkTuple4 a b c d = (a, b, c, d)
    107 {-# COMPLETE MkTuple4 #-}
    108 
    109 type MkTuple5 :: a -> b -> c -> d -> e -> Tuple5 a b c d e
    110 type MkTuple5 = (,,,,)
    111 pattern MkTuple5 :: a -> b -> c -> d -> e -> Tuple5 a b c d e
    112 pattern MkTuple5 a b c d e = (a, b, c, d, e)
    113 {-# COMPLETE MkTuple5 #-}
    114 
    115 type MkTuple6 :: a -> b -> c -> d -> e -> f -> Tuple6 a b c d e f
    116 type MkTuple6 = (,,,,,)
    117 pattern MkTuple6 :: a -> b -> c -> d -> e -> f -> Tuple6 a b c d e f
    118 pattern MkTuple6 a b c d e f = (a, b, c, d, e, f)
    119 {-# COMPLETE MkTuple6 #-}
    120 
    121 type MkTuple7 :: a -> b -> c -> d -> e -> f -> g -> Tuple7 a b c d e f g
    122 type MkTuple7 = (,,,,,,)
    123 pattern MkTuple7 :: a -> b -> c -> d -> e -> f -> g -> Tuple7 a b c d e f g
    124 pattern MkTuple7 a b c d e f g = (a, b, c, d, e, f, g)
    125 {-# COMPLETE MkTuple7 #-}
    126 
    127 type MkTuple8 :: a -> b -> c -> d -> e -> f -> g -> h -> Tuple8 a b c d e f g h
    128 type MkTuple8 = (,,,,,,,)
    129 pattern MkTuple8 :: a -> b -> c -> d -> e -> f -> g -> h -> Tuple8 a b c d e f g h
    130 pattern MkTuple8 a b c d e f g h = (a, b, c, d, e, f, g, h)
    131 {-# COMPLETE MkTuple8 #-}
    132 
    133 type MkTuple9 :: a -> b -> c -> d -> e -> f -> g -> h -> i -> Tuple9 a b c d e f g h i
    134 type MkTuple9 = (,,,,,,,,)
    135 pattern MkTuple9 :: a -> b -> c -> d -> e -> f -> g -> h -> i -> Tuple9 a b c d e f g h i
    136 pattern MkTuple9 a b c d e f g h i = (a, b, c, d, e, f, g, h, i)
    137 {-# COMPLETE MkTuple9 #-}
    138 
    139 --------------------------------------------------------------------------------
    140 
    141 type R :: forall {r :: Repr}. Type# r -> Repr
    142 type family R _ where
    143     R (_ :: Type# r) = r
    144 
    145 type TupleRepr :: forall {k}. k -> Repr
    146 type family TupleRepr _ where
    147     TupleRepr () = Repr.Tuple []
    148     TupleRepr (a) = Repr.Tuple [R a]
    149     TupleRepr (a, b) = Repr.Tuple [R a, R b]
    150     TupleRepr (a, b, c) = Repr.Tuple [R a, R b, R c]
    151     TupleRepr (a, b, c, d) = Repr.Tuple [R a, R b, R c, R d]
    152     TupleRepr (a, b, c, d, e) = Repr.Tuple [R a, R b, R c, R d, R e]
    153     TupleRepr (a, b, c, d, e, f) = Repr.Tuple [R a, R b, R c, R d, R e, R f]
    154     TupleRepr (a, b, c, d, e, f, g) = Repr.Tuple [R a, R b, R c, R d, R e, R f, R g]
    155     TupleRepr (a, b, c, d, e, f, g, h) = Repr.Tuple [R a, R b, R c, R d, R e, R f, R g, R h]
    156     TupleRepr (a, b, c, d, e, f, g, h, i) = Repr.Tuple [R a, R b, R c, R d, R e, R f, R g, R h, R i]
    157     TupleRepr (GHC.MkSolo a) = Repr.Tuple [R a]
    158 
    159 type Tuple# :: forall {k}. forall (a :: k) -> Type# (TupleRepr a)
    160 type family Tuple# _ where
    161     Tuple# () = GHC.Tuple0#
    162     Tuple# (a) = GHC.Tuple1# a
    163     Tuple# (a, b) = GHC.Tuple2# a b
    164     Tuple# (a, b, c) = GHC.Tuple3# a b c
    165     Tuple# (a, b, c, d) = GHC.Tuple4# a b c d
    166     Tuple# (a, b, c, d, e) = GHC.Tuple5# a b c d e
    167     Tuple# (a, b, c, d, e, f) = GHC.Tuple6# a b c d e f
    168     Tuple# (a, b, c, d, e, f, g) = GHC.Tuple7# a b c d e f g
    169     Tuple# (a, b, c, d, e, f, g, h) = GHC.Tuple8# a b c d e f g h
    170     Tuple# (a, b, c, d, e, f, g, h, i) = GHC.Tuple9# a b c d e f g h i
    171     Tuple# (GHC.MkSolo a) = GHC.Tuple1# a
    172 
    173 type Tuple :: forall {k}. k -> Type
    174 type family Tuple _ where
    175     Tuple () = GHC.Tuple0
    176     Tuple (a) = GHC.Tuple1 a
    177     Tuple (a, b) = GHC.Tuple2 a b
    178     Tuple (a, b, c) = GHC.Tuple3 a b c
    179     Tuple (a, b, c, d) = GHC.Tuple4 a b c d
    180     Tuple (a, b, c, d, e) = GHC.Tuple5 a b c d e
    181     Tuple (a, b, c, d, e, f) = GHC.Tuple6 a b c d e f
    182     Tuple (a, b, c, d, e, f, g) = GHC.Tuple7 a b c d e f g
    183     Tuple (a, b, c, d, e, f, g, h) = GHC.Tuple8 a b c d e f g h
    184     Tuple (a, b, c, d, e, f, g, h, i) = GHC.Tuple9 a b c d e f g h i
    185     Tuple (GHC.MkSolo a) = GHC.Tuple1 a