packages feed

fresnel-0.0.0.0: src/Fresnel/List/NonEmpty.hs

module Fresnel.List.NonEmpty
( -- * Optics
  nonEmpty_
, uncons_
, head_
, tail_
) where

import qualified Data.List.NonEmpty as NE
import           Fresnel.Iso (Iso, from, iso)
import           Fresnel.Lens (Lens')
import           Fresnel.Tuple (fst_, snd_)

-- Optics

nonEmpty_ :: Iso [a] [b] (Maybe (NE.NonEmpty a)) (Maybe (NE.NonEmpty b))
nonEmpty_ = iso NE.nonEmpty (foldMap NE.toList)

uncons_ :: Iso (NE.NonEmpty a) (NE.NonEmpty b) (a, Maybe (NE.NonEmpty a)) (b, Maybe (NE.NonEmpty b))
uncons_ = iso NE.uncons (uncurry (NE.:|) . fmap (foldMap NE.toList))

head_ :: Lens' (NE.NonEmpty a) a
head_ = uncons_.fst_

tail_ :: Lens' (NE.NonEmpty a) [a]
tail_ = uncons_.snd_.from nonEmpty_