Skip to content

Instantly share code, notes, and snippets.

@ckoster22
Created April 26, 2019 12:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ckoster22/3b5ef766926ffc357d6e27d99d4ab996 to your computer and use it in GitHub Desktop.
Save ckoster22/3b5ef766926ffc357d6e27d99d4ab996 to your computer and use it in GitHub Desktop.
module NonEmpty exposing (NonEmpty, all, foldl, indexedMap, list, map, takeFromTail, toList)
import Fuzz exposing (Fuzzer)
-- Types
type alias NonEmpty a =
( a, List a )
-- Exposed Functions
all : (a -> Bool) -> NonEmpty a -> Bool
all predicate ( first, tail ) =
predicate first && List.all predicate tail
any : (a -> Bool) -> NonEmpty a -> Bool
any predicate ( first, tail ) =
predicate first || List.any predicate tail
append : NonEmpty a -> NonEmpty a -> NonEmpty a
append ( first1, tail1 ) ( first2, tail2 ) =
( first1, List.append tail1 <| List.append [ first2 ] tail2 )
concat : NonEmpty (NonEmpty a) -> NonEmpty a
concat ( ( first, tail ), nonempties ) =
( first, List.append tail <| List.concat <| List.map toList nonempties )
foldl : (a -> b -> b) -> b -> NonEmpty a -> b
foldl callback accumulator ( first, tail ) =
List.foldl callback accumulator (first :: tail)
foldr : (a -> b -> b) -> b -> NonEmpty a -> b
foldr callback accumulator ( first, tail ) =
List.foldr callback accumulator (first :: tail)
head : NonEmpty a -> a
head =
Tuple.first
indexedMap : (Int -> a -> b) -> NonEmpty a -> NonEmpty b
indexedMap mapper ( first, tail ) =
( mapper 0 first, List.indexedMap (\index a -> mapper (index + 1) a) tail )
map : (a -> b) -> NonEmpty a -> NonEmpty b
map mapper ( first, tail ) =
( mapper first, List.map mapper tail )
length : NonEmpty a -> Int
length nonempty =
nonempty
|> toList
|> List.length
reverse : NonEmpty a -> NonEmpty a
reverse (( first, tail ) as original) =
case List.reverse tail of
last :: reversedRest ->
( last, List.append reversedRest [ first ] )
_ ->
original
takeFromTail : Int -> NonEmpty a -> NonEmpty a
takeFromTail numToTake ( first, tail ) =
( first, List.take numToTake tail )
toList : NonEmpty a -> List a
toList ( first, tail ) =
first :: tail
-- Fuzzers
list : Fuzzer a -> Fuzzer (NonEmpty a)
list fuzzer =
Fuzz.tuple ( fuzzer, Fuzz.list fuzzer )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment