summaryrefslogtreecommitdiff
path: root/Alpha.hs
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2020-04-12 12:15:49 -0700
committerBen Sima <ben@bsima.me>2020-04-12 19:01:15 -0700
commit46a680f7ca7def264a0f0b616883fb8e47271bab (patch)
tree92020970623359e6dc76f02d7c537c846c1d4ed9 /Alpha.hs
parent72e42deeb5d5b9cd2765d2ff20a06e708f8efc07 (diff)
De-namespace Alpha
A bunch of formatting changes got in there too. Oops. I will probably eventually de-namespace everything, mostly because I'm tired of typing "Com.Whatever.Thing" all the time. A better namespacing strategy might be to use normal Haskell namespacing (Data, Control, Network, etc) for code that is not specific to biz activities (i.e. if I could open-source it at any time), and use simply "Biz" for stuff that I would never want to open-source.
Diffstat (limited to 'Alpha.hs')
-rw-r--r--Alpha.hs87
1 files changed, 87 insertions, 0 deletions
diff --git a/Alpha.hs b/Alpha.hs
new file mode 100644
index 0000000..fe5c9df
--- /dev/null
+++ b/Alpha.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+-- | Commonly useful functions, a Prelude replacement.
+--
+-- This is designed to be imported everywhere, unqualified (generally
+-- the only unqualified import you should use).
+--
+-- Alpha can be opinionated and break with other Haskell idioms. For
+-- example, we define our own operators which have a pattern to their
+-- characters:
+--
+-- - `|` normal function-level applications
+-- - `/` indicates doing something inside a functor
+-- - `<` and `>` indicate the direction in which values flow
+-- between functions
+--
+-- It seems unnecessarily different at first but it makes things easier
+-- to read quickly.
+module Alpha
+ (
+ -- * Re-export Protolude
+ module X
+ -- * Applying
+ , (<|)
+ , (|>)
+ -- * Mapping
+ , (/>)
+ , (</)
+ , (<//)
+ -- * Text
+ , chomp
+ , lchomp
+ , joinWith
+ -- * Debugging tools
+ , say
+ )
+where
+
+import Data.Function ( (&) )
+import Data.Functor ( (<&>) )
+import Data.String
+import Data.Text ( Text )
+import qualified Data.Text as Text
+import qualified Data.Text.Lazy as LazyText
+import Protolude as X
+
+-- | Debugging printf
+say :: Text -> IO ()
+say msg = putStrLn msg
+
+-- | Alias for map, fmap, <$>
+(</) :: Functor f => (a -> b) -> f a -> f b
+(</) = fmap
+
+-- | Double fmap. A function on the left goes "into" two functors
+-- (i.e. it goes "two levels deep"), applies the function to the inner
+-- values, then returns the result wrapped in the two functors.
+(<//) :: (Functor f0, Functor f1) => (a -> b) -> f0 (f1 a) -> f0 (f1 b)
+(<//) = fmap . fmap
+
+-- | Normal function application. Do the right side, then pass the
+-- return value to the function on the left side.
+(<|) :: (a -> b) -> a -> b
+(<|) = ($)
+infixr 0 <|
+
+-- | Reverse function application. Do the left side, then pass the
+-- return value to the function on the right side.
+(|>) :: a -> (a -> b) -> b
+(|>) = (&)
+
+-- | Alias for <&>. Can be read as "and then". Basically does into a
+-- functor, does some computation, then returns the same kind of
+-- functor. Could also be defined as `f >>= return . g`
+(/>) :: Functor f => f a -> (a -> b) -> f b
+(/>) = (<&>)
+
+-- | Removes newlines from text.
+chomp :: Text -> Text
+chomp = Text.filter (/= '\n')
+
+-- | Removes newlines from lazy text.
+lchomp :: LazyText.Text -> LazyText.Text
+lchomp = LazyText.filter (/= '\n')
+
+-- | Join a list of things with a separator.
+joinWith :: [a] -> [[a]] -> [a]
+joinWith = intercalate