packages feed

pez-0.1.0: PreludeLenses.hs

{-# LANGUAGE TypeOperators #-}
module PreludeLenses
    where

import Data.Label.Maybe
import qualified Data.Label.Abstract as A
import Control.Arrow


-- First class labels pre-defined for the standard types from haskell's prelude

-- | [a]
lHead :: [a] :~> a
lHead = lens getHead (\h-> Just . (h:))
    where getHead (h:_) = Just h
          getHead []    = Nothing

lTail :: [a] :~> [a]
lTail = lens getTail setTail
    where setTail t (h:_) = Just $ h:t
          setTail t []    = Nothing

          getTail (_:t) = Just t
          getTail []    = Nothing

-- | (a,b)
--lFst :: (a,b) :~> a
--lFst = lens fst (\a (_,b)-> (a,b))
lFst :: Arrow (~>) => A.Lens (~>) (a,b) a
lFst = A.lens (arr fst) (arr $ \(a, (_,b))-> (a,b))

--lSnd :: (a,b) :-> b
lSnd :: Arrow (~>) => A.Lens (~>) (a,b) b
lSnd = A.lens (arr snd) (arr $ \(b, (a,_))-> (a,b))