diff options
author | Tom Smeding <tom@tomsmeding.com> | 2024-12-12 22:40:17 +0100 |
---|---|---|
committer | Tom Smeding <tom@tomsmeding.com> | 2024-12-12 22:40:17 +0100 |
commit | 27e5422c541623fbee36f2eedf37bb3d2ca3d14c (patch) | |
tree | aa571776e2afed4131b90787a7279c755ab9647c /src/Data.hs | |
parent | f323076ddf6fbea9f7a1a4dfeec98629459c49fc (diff) |
Improve Compile a little (still only scalars)
Diffstat (limited to 'src/Data.hs')
-rw-r--r-- | src/Data.hs | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/Data.hs b/src/Data.hs index fc39814..0be9046 100644 --- a/src/Data.hs +++ b/src/Data.hs @@ -10,6 +10,7 @@ {-# LANGUAGE TypeOperators #-} module Data (module Data, (:~:)(Refl)) where +import Data.Functor.Product import Data.Type.Equality import Unsafe.Coerce (unsafeCoerce) @@ -30,6 +31,14 @@ slistMap :: (forall t. f t -> g t) -> SList f list -> SList g list slistMap _ SNil = SNil slistMap f (SCons x list) = SCons (f x) (slistMap f list) +slistMapA :: Applicative m => (forall t. f t -> m (g t)) -> SList f list -> m (SList g list) +slistMapA _ SNil = pure SNil +slistMapA f (SCons x list) = SCons <$> f x <*> slistMapA f list + +slistZip :: SList f list -> SList g list -> SList (Product f g) list +slistZip SNil SNil = SNil +slistZip (x `SCons` l1) (y `SCons` l2) = Pair x y `SCons` slistZip l1 l2 + unSList :: (forall t. f t -> a) -> SList f list -> [a] unSList _ SNil = [] unSList f (x `SCons` l) = f x : unSList f l |