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_ :: Optic p [a] [b] (Maybe (NonEmpty a)) (Maybe (NonEmpty b))
nonEmpty_ = ([a] -> Maybe (NonEmpty a))
-> (Maybe (NonEmpty b) -> [b])
-> Iso [a] [b] (Maybe (NonEmpty a)) (Maybe (NonEmpty b))
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso [a] -> Maybe (NonEmpty a)
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty ((NonEmpty b -> [b]) -> Maybe (NonEmpty b) -> [b]
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap NonEmpty b -> [b]
forall a. NonEmpty a -> [a]
NE.toList)

uncons_ :: Iso (NE.NonEmpty a) (NE.NonEmpty b) (a, Maybe (NE.NonEmpty a)) (b, Maybe (NE.NonEmpty b))
uncons_ :: Optic
  p
  (NonEmpty a)
  (NonEmpty b)
  (a, Maybe (NonEmpty a))
  (b, Maybe (NonEmpty b))
uncons_ = (NonEmpty a -> (a, Maybe (NonEmpty a)))
-> ((b, Maybe (NonEmpty b)) -> NonEmpty b)
-> Iso
     (NonEmpty a)
     (NonEmpty b)
     (a, Maybe (NonEmpty a))
     (b, Maybe (NonEmpty b))
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso NonEmpty a -> (a, Maybe (NonEmpty a))
forall a. NonEmpty a -> (a, Maybe (NonEmpty a))
NE.uncons ((b -> [b] -> NonEmpty b) -> (b, [b]) -> NonEmpty b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry b -> [b] -> NonEmpty b
forall a. a -> [a] -> NonEmpty a
(NE.:|) ((b, [b]) -> NonEmpty b)
-> ((b, Maybe (NonEmpty b)) -> (b, [b]))
-> (b, Maybe (NonEmpty b))
-> NonEmpty b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe (NonEmpty b) -> [b]) -> (b, Maybe (NonEmpty b)) -> (b, [b])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((NonEmpty b -> [b]) -> Maybe (NonEmpty b) -> [b]
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap NonEmpty b -> [b]
forall a. NonEmpty a -> [a]
NE.toList))

head_ :: Lens' (NE.NonEmpty a) a
head_ :: Optic p (NonEmpty a) (NonEmpty a) a a
head_ = Optic
  p
  (NonEmpty a)
  (NonEmpty a)
  (a, Maybe (NonEmpty a))
  (a, Maybe (NonEmpty a))
forall a b.
Iso
  (NonEmpty a)
  (NonEmpty b)
  (a, Maybe (NonEmpty a))
  (b, Maybe (NonEmpty b))
uncons_Optic
  p
  (NonEmpty a)
  (NonEmpty a)
  (a, Maybe (NonEmpty a))
  (a, Maybe (NonEmpty a))
-> (p a a -> p (a, Maybe (NonEmpty a)) (a, Maybe (NonEmpty a)))
-> Optic p (NonEmpty a) (NonEmpty a) a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.p a a -> p (a, Maybe (NonEmpty a)) (a, Maybe (NonEmpty a))
forall a b a'. Lens (a, b) (a', b) a a'
fst_

tail_ :: Lens' (NE.NonEmpty a) [a]
tail_ :: Optic p (NonEmpty a) (NonEmpty a) [a] [a]
tail_ = Optic
  p
  (NonEmpty a)
  (NonEmpty a)
  (a, Maybe (NonEmpty a))
  (a, Maybe (NonEmpty a))
forall a b.
Iso
  (NonEmpty a)
  (NonEmpty b)
  (a, Maybe (NonEmpty a))
  (b, Maybe (NonEmpty b))
uncons_Optic
  p
  (NonEmpty a)
  (NonEmpty a)
  (a, Maybe (NonEmpty a))
  (a, Maybe (NonEmpty a))
-> (p [a] [a] -> p (a, Maybe (NonEmpty a)) (a, Maybe (NonEmpty a)))
-> Optic p (NonEmpty a) (NonEmpty a) [a] [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Optic
  p
  (a, Maybe (NonEmpty a))
  (a, Maybe (NonEmpty a))
  (Maybe (NonEmpty a))
  (Maybe (NonEmpty a))
forall a b b'. Lens (a, b) (a, b') b b'
snd_Optic
  p
  (a, Maybe (NonEmpty a))
  (a, Maybe (NonEmpty a))
  (Maybe (NonEmpty a))
  (Maybe (NonEmpty a))
-> (p [a] [a] -> p (Maybe (NonEmpty a)) (Maybe (NonEmpty a)))
-> p [a] [a]
-> p (a, Maybe (NonEmpty a)) (a, Maybe (NonEmpty a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Iso [a] [a] (Maybe (NonEmpty a)) (Maybe (NonEmpty a))
-> Iso (Maybe (NonEmpty a)) (Maybe (NonEmpty a)) [a] [a]
forall s t a b. Iso s t a b -> Iso b a t s
from forall a b. Iso [a] [b] (Maybe (NonEmpty a)) (Maybe (NonEmpty b))
Iso [a] [a] (Maybe (NonEmpty a)) (Maybe (NonEmpty a))
nonEmpty_