functor-combo-0.0.8: src/FunctorCombo/Strict.hs
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall #-}
----------------------------------------------------------------------
-- |
-- Module : FunctorCombo.Strict
-- Copyright : (c) Conal Elliott 2010
-- License : BSD3
--
-- Maintainer : conal@conal.net
-- Stability : experimental
--
-- Strict products and sums.Strict
----------------------------------------------------------------------
module FunctorCombo.Strict
( (:*!)(..),curry',uncurry', (:+!)(..),either'
) where
infixl 7 :*!
infixl 6 :+!
{--------------------------------------------------------------------
Products
--------------------------------------------------------------------}
-- | Strict pair
data a :*! b = !a :*! !b
-- | Curry on strict pairs
curry' :: (a :*! b -> c) -> (a -> b -> c)
curry' f a b = f (a :*! b)
-- | Uncurry on strict pairs
uncurry' :: (a -> b -> c) -> ((a :*! b) -> c)
uncurry' f (a :*! b) = f a b
{--------------------------------------------------------------------
Sums
--------------------------------------------------------------------}
-- | Strict sum
data a :+! b = Left' !a | Right' !b
-- | Case analysis for strict sums. Like 'either'.
either' :: (a -> c) -> (b -> c) -> (a :+! b -> c)
either' f _ (Left' a) = f a
either' _ g (Right' b) = g b