lude

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

commit 811fe1fb26404329d105b547b7ea968ac32c6f04
parent 01719e7037df80215b5de677206f63e01c3b9b51
Author: Robert Russell <robert@rr3.xyz>
Date:   Mon,  5 Oct 2026 09:53:55 -0700

Haskell: reorganize tuples; add type/pattern constructors

Diffstat:
Msrc/Lude/Haskell.hs | 1+
Msrc/Lude/Haskell/Constraint.hs | 1+
Asrc/Lude/Haskell/Tuple.hs | 185+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Lude/Haskell/Type.hs | 53-----------------------------------------------------
4 files changed, 187 insertions(+), 53 deletions(-)

diff --git a/src/Lude/Haskell.hs b/src/Lude/Haskell.hs @@ -12,6 +12,7 @@ import Lude.Haskell.Core as X import Lude.Haskell.Equality as X import Lude.Haskell.Functional as X import Lude.Haskell.Generic as X hiding (Rep, Rep1, from, from1, to, to1) +import Lude.Haskell.Tuple as X import Lude.Haskell.Type as X -- TODO: Data.Coerce diff --git a/src/Lude/Haskell/Constraint.hs b/src/Lude/Haskell/Constraint.hs @@ -38,6 +38,7 @@ type Relation i j = Constraint2 i j -------------------------------------------------------------------------------- +-- TODO: Synchronize with type tuples. type All :: forall {k}. k -> Constraint type family All _ where All () = GHC.CTuple0 diff --git a/src/Lude/Haskell/Tuple.hs b/src/Lude/Haskell/Tuple.hs @@ -0,0 +1,185 @@ +module Lude.Haskell.Tuple ( + Tuple0#, + Tuple1#, + Tuple2#, + Tuple3#, + Tuple4#, + Tuple5#, + Tuple6#, + Tuple7#, + Tuple8#, + Tuple9#, + Tuple0, + MkTuple0, + pattern MkTuple0, + Tuple1, + MkTuple1, + pattern MkTuple1, + Tuple2, + MkTuple2, + pattern MkTuple2, + Tuple3, + MkTuple3, + pattern MkTuple3, + Tuple4, + MkTuple4, + pattern MkTuple4, + Tuple5, + MkTuple5, + pattern MkTuple5, + Tuple6, + MkTuple6, + pattern MkTuple6, + Tuple7, + MkTuple7, + pattern MkTuple7, + Tuple8, + MkTuple8, + pattern MkTuple8, + Tuple9, + MkTuple9, + pattern MkTuple9, + Tuple#, + Tuple, +) where + +import Data.Tuple.Experimental ( + Tuple0, + Tuple0#, + Tuple1, + Tuple1#, + Tuple2, + Tuple2#, + Tuple3, + Tuple3#, + Tuple4, + Tuple4#, + Tuple5, + Tuple5#, + Tuple6, + Tuple6#, + Tuple7, + Tuple7#, + Tuple8, + Tuple8#, + Tuple9, + Tuple9#, + ) + +import Data.Tuple.Experimental qualified as GHC + +import Lude.Haskell.Core +import Lude.Haskell.Repr qualified as Repr +import Lude.Haskell.Type + +-- TODO: Rename so that we don't have # in names? + +-------------------------------------------------------------------------------- + +type MkTuple0 :: Tuple0 +type MkTuple0 = () +pattern MkTuple0 :: Tuple0 +pattern MkTuple0 = () +{-# COMPLETE MkTuple0 #-} + +type MkTuple1 :: a -> Tuple1 a +type MkTuple1 = GHC.MkSolo +pattern MkTuple1 :: a -> Tuple1 a +pattern MkTuple1 a = GHC.MkSolo a +{-# COMPLETE MkTuple1 #-} + +type MkTuple2 :: a -> b -> Tuple2 a b +type MkTuple2 = (,) +pattern MkTuple2 :: a -> b -> Tuple2 a b +pattern MkTuple2 a b = (a, b) +{-# COMPLETE MkTuple2 #-} + +type MkTuple3 :: a -> b -> c -> Tuple3 a b c +type MkTuple3 = (,,) +pattern MkTuple3 :: a -> b -> c -> Tuple3 a b c +pattern MkTuple3 a b c = (a, b, c) +{-# COMPLETE MkTuple3 #-} + +type MkTuple4 :: a -> b -> c -> d -> Tuple4 a b c d +type MkTuple4 = (,,,) +pattern MkTuple4 :: a -> b -> c -> d -> Tuple4 a b c d +pattern MkTuple4 a b c d = (a, b, c, d) +{-# COMPLETE MkTuple4 #-} + +type MkTuple5 :: a -> b -> c -> d -> e -> Tuple5 a b c d e +type MkTuple5 = (,,,,) +pattern MkTuple5 :: a -> b -> c -> d -> e -> Tuple5 a b c d e +pattern MkTuple5 a b c d e = (a, b, c, d, e) +{-# COMPLETE MkTuple5 #-} + +type MkTuple6 :: a -> b -> c -> d -> e -> f -> Tuple6 a b c d e f +type MkTuple6 = (,,,,,) +pattern MkTuple6 :: a -> b -> c -> d -> e -> f -> Tuple6 a b c d e f +pattern MkTuple6 a b c d e f = (a, b, c, d, e, f) +{-# COMPLETE MkTuple6 #-} + +type MkTuple7 :: a -> b -> c -> d -> e -> f -> g -> Tuple7 a b c d e f g +type MkTuple7 = (,,,,,,) +pattern MkTuple7 :: a -> b -> c -> d -> e -> f -> g -> Tuple7 a b c d e f g +pattern MkTuple7 a b c d e f g = (a, b, c, d, e, f, g) +{-# COMPLETE MkTuple7 #-} + +type MkTuple8 :: a -> b -> c -> d -> e -> f -> g -> h -> Tuple8 a b c d e f g h +type MkTuple8 = (,,,,,,,) +pattern MkTuple8 :: a -> b -> c -> d -> e -> f -> g -> h -> Tuple8 a b c d e f g h +pattern MkTuple8 a b c d e f g h = (a, b, c, d, e, f, g, h) +{-# COMPLETE MkTuple8 #-} + +type MkTuple9 :: a -> b -> c -> d -> e -> f -> g -> h -> i -> Tuple9 a b c d e f g h i +type MkTuple9 = (,,,,,,,,) +pattern MkTuple9 :: a -> b -> c -> d -> e -> f -> g -> h -> i -> Tuple9 a b c d e f g h i +pattern MkTuple9 a b c d e f g h i = (a, b, c, d, e, f, g, h, i) +{-# COMPLETE MkTuple9 #-} + +-------------------------------------------------------------------------------- + +type R :: forall {r :: Repr}. Type# r -> Repr +type family R _ where + R (_ :: Type# r) = r + +type TupleRepr :: forall {k}. k -> Repr +type family TupleRepr _ where + TupleRepr () = Repr.Tuple [] + TupleRepr (a) = Repr.Tuple [R a] + TupleRepr (a, b) = Repr.Tuple [R a, R b] + TupleRepr (a, b, c) = Repr.Tuple [R a, R b, R c] + TupleRepr (a, b, c, d) = Repr.Tuple [R a, R b, R c, R d] + TupleRepr (a, b, c, d, e) = Repr.Tuple [R a, R b, R c, R d, R e] + TupleRepr (a, b, c, d, e, f) = Repr.Tuple [R a, R b, R c, R d, R e, R f] + TupleRepr (a, b, c, d, e, f, g) = Repr.Tuple [R a, R b, R c, R d, R e, R f, R g] + 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] + 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] + TupleRepr (GHC.MkSolo a) = Repr.Tuple [R a] + +type Tuple# :: forall {k}. forall (a :: k) -> Type# (TupleRepr a) +type family Tuple# _ where + Tuple# () = GHC.Tuple0# + Tuple# (a) = GHC.Tuple1# a + Tuple# (a, b) = GHC.Tuple2# a b + Tuple# (a, b, c) = GHC.Tuple3# a b c + Tuple# (a, b, c, d) = GHC.Tuple4# a b c d + Tuple# (a, b, c, d, e) = GHC.Tuple5# a b c d e + Tuple# (a, b, c, d, e, f) = GHC.Tuple6# a b c d e f + Tuple# (a, b, c, d, e, f, g) = GHC.Tuple7# a b c d e f g + Tuple# (a, b, c, d, e, f, g, h) = GHC.Tuple8# a b c d e f g h + Tuple# (a, b, c, d, e, f, g, h, i) = GHC.Tuple9# a b c d e f g h i + Tuple# (GHC.MkSolo a) = GHC.Tuple1# a + +type Tuple :: forall {k}. k -> Type +type family Tuple _ where + Tuple () = GHC.Tuple0 + Tuple (a) = GHC.Tuple1 a + Tuple (a, b) = GHC.Tuple2 a b + Tuple (a, b, c) = GHC.Tuple3 a b c + Tuple (a, b, c, d) = GHC.Tuple4 a b c d + Tuple (a, b, c, d, e) = GHC.Tuple5 a b c d e + Tuple (a, b, c, d, e, f) = GHC.Tuple6 a b c d e f + Tuple (a, b, c, d, e, f, g) = GHC.Tuple7 a b c d e f g + Tuple (a, b, c, d, e, f, g, h) = GHC.Tuple8 a b c d e f g h + Tuple (a, b, c, d, e, f, g, h, i) = GHC.Tuple9 a b c d e f g h i + Tuple (GHC.MkSolo a) = GHC.Tuple1 a diff --git a/src/Lude/Haskell/Type.hs b/src/Lude/Haskell/Type.hs @@ -2,11 +2,8 @@ module Lude.Haskell.Type ( Type#, Type, Type1, - Tuple#, - Tuple, ) where -import Data.Tuple.Experimental qualified as GHC import GHC.Exts qualified as GHC import Lude.Haskell.Core @@ -22,53 +19,3 @@ type Type = Type# Repr.BoxL type Type1 :: Kind -> Kind type Type1 i = i -> Type - --------------------------------------------------------------------------------- --- Tuples - -type R :: forall {r :: Repr}. Type# r -> Repr -type family R _ where - R (_ :: Type# r) = r - -type TupleRepr :: forall {k}. k -> Repr -type family TupleRepr _ where - TupleRepr () = Repr.Tuple [] - TupleRepr (a) = Repr.Tuple [R a] - TupleRepr (a, b) = Repr.Tuple [R a, R b] - TupleRepr (a, b, c) = Repr.Tuple [R a, R b, R c] - TupleRepr (a, b, c, d) = Repr.Tuple [R a, R b, R c, R d] - TupleRepr (a, b, c, d, e) = Repr.Tuple [R a, R b, R c, R d, R e] - TupleRepr (a, b, c, d, e, f) = Repr.Tuple [R a, R b, R c, R d, R e, R f] - TupleRepr (a, b, c, d, e, f, g) = Repr.Tuple [R a, R b, R c, R d, R e, R f, R g] - 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] - 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] - TupleRepr (GHC.MkSolo a) = Repr.Tuple [R a] - --- TODO: Rename so that it doesn't have a # in the name. -type Tuple# :: forall {k}. forall (a :: k) -> Type# (TupleRepr a) -type family Tuple# _ where - Tuple# () = GHC.Tuple0# - Tuple# (a) = GHC.Tuple1# a - Tuple# (a, b) = GHC.Tuple2# a b - Tuple# (a, b, c) = GHC.Tuple3# a b c - Tuple# (a, b, c, d) = GHC.Tuple4# a b c d - Tuple# (a, b, c, d, e) = GHC.Tuple5# a b c d e - Tuple# (a, b, c, d, e, f) = GHC.Tuple6# a b c d e f - Tuple# (a, b, c, d, e, f, g) = GHC.Tuple7# a b c d e f g - Tuple# (a, b, c, d, e, f, g, h) = GHC.Tuple8# a b c d e f g h - Tuple# (a, b, c, d, e, f, g, h, i) = GHC.Tuple9# a b c d e f g h i - Tuple# (GHC.MkSolo a) = GHC.Tuple1# a - -type Tuple :: forall {k}. k -> Type -type family Tuple _ where - Tuple () = GHC.Tuple0 - Tuple (a) = GHC.Tuple1 a - Tuple (a, b) = GHC.Tuple2 a b - Tuple (a, b, c) = GHC.Tuple3 a b c - Tuple (a, b, c, d) = GHC.Tuple4 a b c d - Tuple (a, b, c, d, e) = GHC.Tuple5 a b c d e - Tuple (a, b, c, d, e, f) = GHC.Tuple6 a b c d e f - Tuple (a, b, c, d, e, f, g) = GHC.Tuple7 a b c d e f g - Tuple (a, b, c, d, e, f, g, h) = GHC.Tuple8 a b c d e f g h - Tuple (a, b, c, d, e, f, g, h, i) = GHC.Tuple9 a b c d e f g h i - Tuple (GHC.MkSolo a) = GHC.Tuple1 a