{-# LANGUAGE RankNTypes #-}

-- |
-- Copyright:   (c) 2022 Bodigrim
-- License:     BSD3
module Data.List.Infinite.Internal (
  Infinite (..),
  build,
) where

-- | Type of infinite lists.
--
-- In terms of recursion schemes, 'Infinite' @a@ is a fix point of the base functor @(a,)@,
-- 'Data.List.Infinite.foldr' is a catamorphism and 'Data.List.Infinite.unfoldr' is an anamorphism.
data Infinite a = a :< Infinite a

infixr 5 :<

build :: forall a. (forall b. (a -> b -> b) -> b) -> Infinite a
build :: forall a. (forall b. (a -> b -> b) -> b) -> Infinite a
build forall b. (a -> b -> b) -> b
g = forall b. (a -> b -> b) -> b
g forall a. a -> Infinite a -> Infinite a
(:<)
{-# INLINE [1] build #-}