Skip to content

Instantly share code, notes, and snippets.

@Zemyla
Zemyla / SelectLaws.hs
Created November 11, 2025 20:01
Comonad Laws for Select
import Control.Comonad
import Data.Functor
newtype Select r a = Select { runSelect :: (a -> r) -> a }
instance Functor (Select r) where
fmap f s = Select $ \p -> f $ runSelect s $ p . f
instance Applicative (Select r) where
pure a = Select $ const a
@Zemyla
Zemyla / ArrayUtils.hs
Created March 14, 2020 19:44
Better versions of traverse for Array, runSTArray, and runSTUArray.
{-# LANGUAGE RankNTypes, MagicHash, UnboxedTuples #-}
module TraverseArray (runSTArray, runSTUArray, traverseArray) where
import qualified GHC.Exts as E
import GHC.Exts (State#, Array#, MutableArray#, Int#, Int(..), isTrue#)
import Control.Applicative (Applicative(..))
import qualified Data.Array.Base as A
import Data.Array.Base (UArray(..), STUArray(..))
import GHC.Arr (Array(..), STArray(..))