sanctuary-maybe
The Maybe type represents optional values: a value of type Maybe a is either Nothing (the empty value) or a Just whose value is of type a.
Maybe a satisfies the following Fantasy Land specifications:
> const Useless = require ('sanctuary-useless')
> const isTypeClass = x =>
.   type (x) === 'sanctuary-type-classes/TypeClass@1'
> S.map (k => k + ' '.repeat (16 - k.length) +
.             (Z[k].test (Just (Useless)) ? '\u2705   ' :
.              Z[k].test (Nothing)        ? '\u2705 * ' :
.              /* otherwise */              '\u274C   '))
.       (S.keys (S.unchecked.filter (isTypeClass) (Z)))
[ 'Setoid          ✅ * ',  // if ‘a’ satisfies Setoid
. 'Ord             ✅ * ',  // if ‘a’ satisfies Ord
. 'Semigroupoid    ❌   ',
. 'Category        ❌   ',
. 'Semigroup       ✅ * ',  // if ‘a’ satisfies Semigroup
. 'Monoid          ✅ * ',  // if ‘a’ satisfies Semigroup
. 'Group           ❌   ',
. 'Filterable      ✅   ',
. 'Functor         ✅   ',
. 'Bifunctor       ❌   ',
. 'Profunctor      ❌   ',
. 'Apply           ✅   ',
. 'Applicative     ✅   ',
. 'Chain           ✅   ',
. 'ChainRec        ✅   ',
. 'Monad           ✅   ',
. 'Alt             ✅   ',
. 'Plus            ✅   ',
. 'Alternative     ✅   ',
. 'Foldable        ✅   ',
. 'Traversable     ✅   ',
. 'Extend          ✅   ',
. 'Comonad         ❌   ',
. 'Contravariant   ❌   ' ] 
Maybe :: TypeRep Maybe
 
Maybe type representative.
Maybe.Nothing :: Maybe a
 
The empty value of type Maybe a.
> Nothing
Nothing 
Maybe.Just :: a -> Maybe a
 
Constructs a value of type Maybe a from a value of type a.
> Just (42)
Just (42) 
Maybe.fantasy-land/empty :: () -> Maybe a
 
empty (Maybe)is equivalent toNothing
> S.empty (Maybe)
Nothing 
Maybe.fantasy-land/of :: a -> Maybe a
 
of (Maybe) (x)is equivalent toJust (x)
> S.of (Maybe) (42)
Just (42) 
Maybe.fantasy-land/chainRec :: ((a -> c, b -> c, a) -> Maybe c, a) -> Maybe b
 
> Z.chainRec (
.   Maybe,
.   (next, done, x) =>
.     x <= 1 ? Nothing : Just (x >= 1000 ? done (x) : next (x * x)),
.   1
. )
Nothing
> Z.chainRec (
.   Maybe,
.   (next, done, x) =>
.     x <= 1 ? Nothing : Just (x >= 1000 ? done (x) : next (x * x)),
.   2
. )
Just (65536) 
Maybe.fantasy-land/zero :: () -> Maybe a
 
zero (Maybe)is equivalent toNothing
> S.zero (Maybe)
Nothing 
Maybe#@@show :: Showable a => Maybe a ~> () -> String
 
show (Nothing)is equivalent to'Nothing'show (Just (x))is equivalent to'Just (' + show (x) + ')'
> show (Nothing)
'Nothing'
> show (Just (['foo', 'bar', 'baz']))
'Just (["foo", "bar", "baz"])' 
Maybe#fantasy-land/equals :: Setoid a => Maybe a ~> Maybe a -> Boolean
 
Nothingis equal toNothingJust (x)is equal toJust (y)iffxis equal toyaccording toZ.equalsNothingis never equal toJust (x)
> S.equals (Nothing) (Nothing)
true
> S.equals (Just ([1, 2, 3])) (Just ([1, 2, 3]))
true
> S.equals (Just ([1, 2, 3])) (Just ([3, 2, 1]))
false
> S.equals (Just ([1, 2, 3])) (Nothing)
false 
Maybe#fantasy-land/lte :: Ord a => Maybe a ~> Maybe a -> Boolean
 
Nothingis (less than or) equal toNothingJust (x)is less than or equal toJust (y)iffxis less than or equal toyaccording toZ.lteNothingis always less thanJust (x)
> S.filter (S.lte (Nothing)) ([Nothing, Just (0), Just (1), Just (2)])
[Nothing]
> S.filter (S.lte (Just (1))) ([Nothing, Just (0), Just (1), Just (2)])
[Nothing, Just (0), Just (1)] 
Maybe#fantasy-land/concat :: Semigroup a => Maybe a ~> Maybe a -> Maybe a
 
concat (Nothing) (Nothing)is equivalent toNothingconcat (Just (x)) (Just (y))is equivalent toJust (concat (x) (y))concat (Nothing) (Just (x))is equivalent toJust (x)concat (Just (x)) (Nothing)is equivalent toJust (x)
> S.concat (Nothing) (Nothing)
Nothing
> S.concat (Just ([1, 2, 3])) (Just ([4, 5, 6]))
Just ([1, 2, 3, 4, 5, 6])
> S.concat (Nothing) (Just ([1, 2, 3]))
Just ([1, 2, 3])
> S.concat (Just ([1, 2, 3])) (Nothing)
Just ([1, 2, 3]) 
Maybe#fantasy-land/filter :: Maybe a ~> (a -> Boolean) -> Maybe a
 
filter (p) (Nothing)is equivalent toNothingfilter (p) (Just (x))is equivalent top (x) ? Just (x) : Nothing
> S.filter (isFinite) (Nothing)
Nothing
> S.filter (isFinite) (Just (Infinity))
Nothing
> S.filter (isFinite) (Just (Number.MAX_SAFE_INTEGER))
Just (9007199254740991) 
Maybe#fantasy-land/map :: Maybe a ~> (a -> b) -> Maybe b
 
map (f) (Nothing)is equivalent toNothingmap (f) (Just (x))is equivalent toJust (f (x))
> S.map (Math.sqrt) (Nothing)
Nothing
> S.map (Math.sqrt) (Just (9))
Just (3) 
Maybe#fantasy-land/ap :: Maybe a ~> Maybe (a -> b) -> Maybe b
 
ap (Nothing) (Nothing)is equivalent toNothingap (Nothing) (Just (x))is equivalent toNothingap (Just (f)) (Nothing)is equivalent toNothingap (Just (f)) (Just (x))is equivalent toJust (f (x))
> S.ap (Nothing) (Nothing)
Nothing
> S.ap (Nothing) (Just (9))
Nothing
> S.ap (Just (Math.sqrt)) (Nothing)
Nothing
> S.ap (Just (Math.sqrt)) (Just (9))
Just (3) 
Maybe#fantasy-land/chain :: Maybe a ~> (a -> Maybe b) -> Maybe b
 
chain (f) (Nothing)is equivalent toNothingchain (f) (Just (x))is equivalent tof (x)
> const head = xs => xs.length === 0 ? Nothing : Just (xs[0])
> S.chain (head) (Nothing)
Nothing
> S.chain (head) (Just ([]))
Nothing
> S.chain (head) (Just (['foo', 'bar', 'baz']))
Just ('foo') 
Maybe#fantasy-land/alt :: Maybe a ~> Maybe a -> Maybe a
 
alt (Nothing) (Nothing)is equivalent toNothingalt (Just (x)) (Nothing)is equivalent toJust (x)alt (Nothing) (Just (x))is equivalent toJust (x)alt (Just (y)) (Just (x))is equivalent toJust (x)
> S.alt (Nothing) (Nothing)
Nothing
> S.alt (Just (1)) (Nothing)
Just (1)
> S.alt (Nothing) (Just (2))
Just (2)
> S.alt (Just (4)) (Just (3))
Just (3) 
Maybe#fantasy-land/reduce :: Maybe a ~> ((b, a) -> b, b) -> b
 
reduce (f) (x) (Nothing)is equivalent toxreduce (f) (x) (Just (y))is equivalent tof (x) (y)
> S.reduce (S.concat) ('abc') (Nothing)
'abc'
> S.reduce (S.concat) ('abc') (Just ('xyz'))
'abcxyz' 
Maybe#fantasy-land/traverse :: Applicative f => Maybe a ~> (TypeRep f, a -> f b) -> f (Maybe b)
 
traverse (A) (f) (Nothing)is equivalent toof (A) (Nothing)traverse (A) (f) (Just (x))is equivalent tomap (Just) (f (x))
> S.traverse (Array) (S.words) (Nothing)
[Nothing]
> S.traverse (Array) (S.words) (Just ('foo bar baz'))
[Just ('foo'), Just ('bar'), Just ('baz')] 
Maybe#fantasy-land/extend :: Maybe a ~> (Maybe a -> b) -> Maybe b
 
extend (f) (Nothing)is equivalent toNothingextend (f) (Just (x))is equivalent toJust (f (Just (x)))
> S.extend (S.reduce (S.add) (1)) (Nothing)
Nothing
> S.extend (S.reduce (S.add) (1)) (Just (99))
Just (100) 
