summaryrefslogtreecommitdiff
path: root/src/Data.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Data.hs')
-rw-r--r--src/Data.hs9
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