diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Changelog for polysemy-vinyl
 
+## v0.1.2.0
+
+* Add `separateRecInput`, `separateRecInput'`, `stripRecInput`, `endRecInput`.
+* Inline everything.
+
 ## v0.1.1.0
 
 * Enable `PolyKinds`.
diff --git a/polysemy-vinyl.cabal b/polysemy-vinyl.cabal
--- a/polysemy-vinyl.cabal
+++ b/polysemy-vinyl.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-vinyl
-version:        0.1.1.0
+version:        0.1.2.0
 synopsis:       Functions for mapping vinyl records in polysemy.
 description:    Extra functions for using vinyl records in polysemy.
 category:       Polysemy Vinyl
diff --git a/src/Polysemy/Vinyl.hs b/src/Polysemy/Vinyl.hs
--- a/src/Polysemy/Vinyl.hs
+++ b/src/Polysemy/Vinyl.hs
@@ -6,18 +6,28 @@
 
 Extra functions for using vinyl records with polysemy.
 -}
-{-# LANGUAGE DataKinds     #-}
-{-# LANGUAGE RankNTypes    #-}
-{-# LANGUAGE PolyKinds     #-}
-{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE BlockArguments      #-}
+{-# LANGUAGE DataKinds           #-}
+{-# LANGUAGE GADTs               #-}
+{-# LANGUAGE LambdaCase          #-}
+{-# LANGUAGE RankNTypes          #-}
+{-# LANGUAGE PolyKinds           #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications    #-}
+{-# LANGUAGE TypeOperators       #-}
 module Polysemy.Vinyl (
   rContramapInput
 , rContramapInput'
 , rMapOutput
 , rMapOutput'
+, separateRecInput
+, separateRecInput'
+, stripRecInput
+, endRecInput
 ) where
 
 import Control.Arrow
+import Control.Applicative
 import Data.Vinyl
 import Polysemy
 import Polysemy.Extra
@@ -34,6 +44,7 @@
                 -> Sem (Input (Rec g xs) ': r) a
                 -> Sem r a
 rContramapInput k = contramapInput (rmap k)
+{-# INLINE rContramapInput #-}
 
 -- | Reinterpreting version of `rContramapInput`.
 --
@@ -44,6 +55,7 @@
                  -> Sem (Input (Rec g xs) ': r) a
                  -> Sem (Input (Rec f xs) ': r) a
 rContramapInput' k = raiseUnder >>> rContramapInput k
+{-# INLINE rContramapInput' #-}
 
 -- | Map an `Output` containing a `Rec` covariantly via a natural transformation.
 -- Uses `rmap`.
@@ -55,6 +67,7 @@
            -> Sem (Output (Rec f xs) ': r) a
            -> Sem r a
 rMapOutput k = mapOutput (rmap k)
+{-# INLINE rMapOutput #-}
 
 -- | Reinterpreting version of `rMapOutput`.
 --
@@ -65,3 +78,48 @@
             -> Sem (Output (Rec f xs) ': r) a
             -> Sem (Output (Rec g xs) ': r) a
 rMapOutput' k = raiseUnder >>> rMapOutput k
+{-# INLINE rMapOutput' #-}
+
+-- | Separate one of the fields of an `Input` `Rec` into its own `Input`.
+--
+-- @since 0.1.2.0
+separateRecInput :: forall f x xs r a.
+                    Members '[ Input (Rec f xs)
+                             , Input (f x)] r
+                 => Sem (Input (Rec f (x ': xs)) ': r) a
+                 -> Sem r a
+separateRecInput = interpret \case
+  Input -> liftA2 (:&) (input @(f x)) (input @(Rec f xs))
+{-# INLINE separateRecInput #-}
+
+-- | Reinterpreting version of `separateRecInput`. This assumes you want to handle
+-- the separated case first.
+--
+-- @since 0.1.2.0
+separateRecInput' :: forall f x xs r a.
+                     Sem (Input (Rec f (x ': xs)) ': r) a
+                  -> Sem (Input (f x) ': Input (Rec f xs) ': r) a
+separateRecInput'= reinterpret2 \case
+  Input -> liftA2 (:&) (input @(f x)) (raise $ input @(Rec f xs))
+{-# INLINE separateRecInput' #-}
+
+-- | Like `separateRecInput`, but places the remainer of the `Rec` at the head
+-- of the list while pushing the case into the stack. This is useful when you
+-- want to eliminate the record first by repeated applications of `stripRecInput`.
+--
+-- @since 0.1.2.0
+stripRecInput :: forall f x xs r a.
+                 Members '[Input (f x)] (Input (Rec f xs) ': r)
+              => Sem (Input (Rec f (x ': xs)) ': r) a
+              -> Sem (Input (Rec f xs) ':  r) a
+stripRecInput = reinterpret \case
+  Input -> liftA2 (:&) (input @(f x)) (input @(Rec f xs))
+{-# INLINE stripRecInput #-}
+
+-- | Discard a depleted `Rec` `Input` by returning `RNil`.
+--
+-- @since 0.1.2.0
+endRecInput :: Sem (Input (Rec f '[]) ': r) a -> Sem r a
+endRecInput = interpret \case
+  Input -> return $ RNil
+{-# INLINE endRecInput #-}
